git分支,叉,取,合并,重定位和克隆有什么区别?
有人能帮我理解Git中的分支,分支和克隆之间的区别吗?
同样,当我进行git fetch
而不是git pull
时,它意味着什么?
另外,与merge
相比, rebase
是什么意思?
我怎样才能压缩个人承诺呢?
他们如何使用,他们为什么使用,他们代表什么?
GitHub如何体现?
克隆只是一个存储库的副本。 从表面上看,其结果等同于svn checkout
,您可以从其他仓库下载源代码。 像Subversion这样的集中式VCS和像Git这样的DVCS之间的区别在于,在Git中,当你克隆时,你实际上正在复制整个源代码库,包括所有的历史和分支。 现在,您的计算机上已经有了一个新的存储库,并且您提交的任何提交进入该存储库。 除非将这些提交推送到另一个存储库(或原始存储库),或者直到有人从存储库提取提交(如果可公开访问),否则没有人会看到任何更改。
分支是存储库中的东西。 从概念上讲,它代表了一种发展的线索。 您通常拥有一个主分支,但您也可能有一个分支,您正在使用某个功能xyz,另一个分支修复bug abc。 当您签出分支时,您提交的任何提交将保留在该分支上,并且不会与其他分支共享,除非您将其合并或重新绑定到相关分支上。 当然,就分支而言,Git似乎有点不可思议,除非您查看实现分支的基本模型。 我没有自己解释它(我已经说了太多,methinks),我将链接到Git模型分支和提交的“计算机科学”解释,从Git网站获取:
http://eagain.net/articles/git-for-computer-scientists/
分叉实际上不是Git的概念,它更多的是一种政治/社会理念。 也就是说,如果有些人对项目进行的方式不满意,他们可以将源代码与原始开发人员分离开来。 这将被视为分叉。 Git让分叉变得容易,因为每个人都拥有自己的“主”副本的源代码,所以它就像切断与原始项目开发人员的联系一样简单,并且不需要从共享存储库导出历史记录,就像您可能需要使用SVN 。
编辑:因为我没有意识到像GitHub这样的网站使用的“fork”的现代定义,请查看评论以及Michael Durrant的答案,以获取更多信息。
混帐
我的回答包括github,许多人也问过这个问题。
本地存储库
git(本地)有一个目录(.git),您可以将文件提交到该目录,这是您的“本地存储库”。 这与svn这样的系统不同,你可以立即添加并提交到远程仓库。
git存储通过保存整个文件而改变的文件的每个版本。 它与svn在这方面也有所不同,因为你可以去任何单独的版本,而不需要通过增量变化来“重新创建”它。
git根本不会'锁定'文件,从而避免了编辑的'独占锁定'功能(像pvcs这样的老系统),所以所有文件都可以被编辑,即使在脱机时也是如此。 它实际上在合并文件更改(在同一个文件中!)的过程中一起做了一件了不起的工作,在拉取或提取/推送到远程存储库(如github)期间。 唯一需要手动更改(实际上是编辑文件)的时间是两次更改涉及相同的代码行。
分行
分支允许您保留主代码(“主”分支),复制(新分支),然后在新分支中工作。 如果工作需要一段时间,或者在分支创建之后主人获得大量更新,那么应该完成对主分支的合并或重新分配(通常首选以获得更好的历史记录并更容易解决冲突)。 完成后,将分支中所做的更改合并回主存储库。 许多组织对每件作品都使用分支,无论它是功能,错误还是杂项项目。 其他组织仅使用分支进行版本升级等重大更改。 Fork:用分支控制和管理分支,而用叉子控制接受代码。
一般来说,有两种主要的分行做法。 第一种方法是在主分支上保留大部分更改,只使用分支来处理更大和更长时间的操作,如版本更改,您希望为不同需求提供两个分支。 第二种方式是基本上为每个功能请求,错误修复或杂项创建一个分支,然后手动决定何时将这些分支实际合并到主分支中。 虽然这听起来很乏味,但这是一种常用的方法,也是我目前使用和推荐的方法,因为这样可以使主分支保持清洁,并且它是我们促进生产的主人,所以我们只需要通过重新绑定和合并分支机构。
使分支“进入”掌握的标准方法是进行merge
。 分行也可以rebase
d,以“清理”的历史。 它不会影响当前的状态,而是为了提供一个“更清洁”的历史。 基本上这个想法是你从某个点(通常来自主)分支出来。 既然你分支'主'本身已经向前移动。 因此,如果您在分支中完成的所有更改都与最近一次更改的主人进行了对比,那么它会更清晰。 所以这个过程是:保存更改; 获得“新”主人,然后再次重新应用更改。 请注意,重新合并与合并一样,可能会导致需要手动解析(编辑)的冲突。
需要注意的一条“准则”: 如果分支机构是本地分支机构,并且您尚未将其推送到远程分支机构,那么只需要重组 这主要是因为重新贴牌会改变其他人看到的可能包含他们自己的提交的历史。
跟踪分支
这些是名为origin / branch_name(而不是branch_name)的分支。 当你向/从远程仓库推送代码时,这实际上是发生这种情况的机制。 例如,当你git push
一个名为'building_groups'的分支时,你的分支首先到达origin / building_groups,然后到达远程仓库(实际上这是一个过度简化,但现在足够好了)。 同样,如果您执行git fetch building_groups
,则检索到的文件将放置在您的origin / building_groups分支中。 然后您可以选择将此分支合并到本地副本中。 我们的做法是始终做一个git fetch和一个手动合并,而不仅仅是一个git pull(它可以一步完成上述两个步骤)。
Fetch
新的分支。
获取新分支:在克隆的起始点,您将拥有所有分支。 但是,如果其他开发人员添加分支并将其推送到远程,则需要有一种“知道”这些分支及其名称的方法,以便能够在本地将其撤销。 这是通过git fetch
完成的,它会使用跟踪分支(例如origin /)将所有新的和已更改的分支获取到本地存储库中。 一旦fetch
ed,就可以git branch --remote
列出跟踪分支和git checkout [branch]
实际切换到任何给定git checkout [branch]
。
合并
合并是将来自不同分支的代码更改或来自同一分支的不同版本的代码更改(例如,当本地分支和远程不同步时)进行组合的过程。 如果在分支机构开发了工作并且工作完成,准备好并经过测试,那么它可以合并到master
分支中。 这是由git checkout master
切换到master
分支,然后git merge your_branch
。 合并将带来所有不同的文件,甚至对同一文件进行不同的更改。 这意味着它实际上会更改文件内的代码以合并所有更改。 在完成master
的checkout
出时,还建议使用git pull origin master
来获取合并到本地主服务器中的最新版本的远程主服务器。 如果远程主服务器发生更改,即moved forward
,则会看到反映该git pull
期间的信息。 如果是这样的话(主变),建议您git checkout your_branch
,然后rebase
其掌握,这样的更改实际上是在“新”主人的顶部得到“重播”。 然后你会继续让主人更新,如下一段所示。
如果没有冲突,那么master将添加新的更改。如果存在冲突,这意味着相同的文件围绕类似的代码行进行了更改,无法自动合并。 在这种情况下, git merge new_branch
会报告有冲突要解决。 你可以通过编辑文件来解决它们(这两个文件都会有变化),选择你想要的修改,从字面上删除你不想要的修改,然后保存文件。 这些更改用分隔符(如========
和<<<<<<<<
标记
一旦你解决了任何冲突,你将再次git add
和git commit
这些更改以继续合并(在这个过程中你会从git获得反馈来指导你)。 当这个过程无法正常工作时,你会发现git merge --abort
非常方便重置事情。
交互重新绑定和压缩/重新排序/删除提交
如果你已经在很多小的步骤中完成了工作,例如你每天都提交代码为“正在进行中”,那么你可能想要将这些许多小提交“挤压”成几个更大的提交。 当您想与同事进行代码评审时,这可能特别有用。 您不想重播您通过提交(通过提交)所执行的所有“步骤”,您只想在此处说的是对一次提交中的此项工作的所有更改的最终效果(差异)。 在考虑是否这样做时,评估的关键因素是多次提交是否与多次提交相同的文件或文件(在这种情况下最好压缩提交)。 这是通过交互式重新分配工具完成的。 这个工具可以让你压缩提交,删除提交,重新输入消息等。例如git rebase -i HEAD~10
注意这是一个~
不是-
如下:
请小心,小心使用这个工具。 做一次压扁/删除/重新排序,退出并保存该提交,然后重新输入该工具。 如果提交不连续,您可以对它们重新排序(然后根据需要压扁)。 你实际上也可以在这里删除提交,但是你确实需要确定你在做什么时你正在做的事情!
福克斯
在git仓库中有两种主要的协作方法。 第一,详细的上面是直接通过分支,人们拉和推/从。 这些协作者将其ssh密钥注册到远程存储库。 这将让他们直接推送到该存储库。 缺点是你必须维护用户列表。 另一种方法 - 分叉 - 允许任何人“分岔”存储库,基本上在自己的git存储库帐户中创建本地副本。 然后,他们可以进行更改,并在完成时发送“拉取请求”(实际上它更像是“推送”它们,以及对实际存储库维护人员的“拉取”请求)以便接受代码。
使用分叉的第二种方法不需要某人维护存储库的用户列表。
Github上
github(一个远程仓库)是一个远程源,如果你已经(或被添加到)这样一个仓库,你通常会推送和提交这些已提交的更改,所以本地和远程实际上是非常不同的。 另一种考虑远程存储库的方式是它是一个驻留在远程服务器上的.git目录结构。
当你'分叉' - 在github网页浏览器gui中,你可以点击 - 您在github帐户中创建代码副本('克隆')。 首次执行时可能会有点微妙,因此请确保您查看其代码库所列的代码库 - 无论是原始所有者,还是您自己分配的代码库,例如
获得本地副本后,可以根据需要进行更改(通过将其推送到本地计算机上)。 完成后,您向原始存储库所有者/管理员提交“拉取请求”(听起来很花哨,但实际上您只需点击此处: - ),他们“拉”进去。
在一起编写代码的团队中,更常见的是“克隆”存储库(单击存储库主屏幕上的“复制”图标)。 然后,在本地输入git clone [paste]这会在本地设置你,你也可以推送到(共享的)github位置。
克隆
如github上的部分所示,克隆是存储库的副本。 当你有一个远程仓库时,你可以针对它的URL发出git clone命令,然后你最终得到一个本地拷贝或者仓库的克隆。 这个克隆拥有一切 ,文件,主分支,其他分支,所有现有的提交,整个shebang。 正是这个克隆,你做你的增加和承诺,然后远程存储库本身就是你推这些提交。 正是这种本地/远程的概念使git(和Mercurial类似的系统)成为一个DVCS( 分布式版本控制系统),而不像更传统的CVS(代码版本管理系统),例如SVN,PVCS,CVS等。你直接提交到远程仓库。
可视化
可以看到核心概念的可视化
http://marklodato.github.com/visual-git-guide/index-en.html和
http://ndpsoftware.com/git-cheatsheet.html#loc=index
如果你想要一个视觉显示如何变化的工作,你不能击败视觉工具gitg(gitx for mac)与gui,我称之为'地铁地图'(特别是伦敦地铁),非常适合显示谁做了什么,事情如何变化,分歧和合并等等。
您也可以使用它来添加,提交和管理您的更改!
尽管gitg / gitx非常小,但在过去的2 - 3年(2009-2012年),gui工具的数量不断扩大。 许多Mac用户使用brotherbard的gitx分支和Linux的一个很好的选择是smart-git与一个直观而强大的界面:
请注意,即使使用gui工具,您也可能会在命令行上执行大量命令。
为此,我在〜/ .bash_aliases文件(这是从我的〜/ .bashrc文件为每个终端会话调用:
# git
alias gst='git status' # Warning: gst conflicts with gnu-smalltalk (when used).
alias gb='git branch'
alias gco='git checkout'
alias gcob='git checkout -b '
alias ga='git add '
alias gc='git commit'
alias gg='git grep ' # A great very FAST search option, easier then `find`
最后,6个关键的救生员:
1)你搞砸了你的本地分支,只想回到你上次做git pull的时候:
git reset --hard origin/master # You will need to be comfortable doing this!
2)你开始在本地进行修改,编辑六十个文件,然后,哦,废话,你仍然在主(或另一个)分支:
git checkout -b new_branch_name # just create a new branch
git add . # add the changes files
git commit -m"your message" # and commit them
3)你在当前分支中搞乱了一个特定的文件,并且希望基本上'重置'该文件(失去更改),直到你最后一次从远程仓库中取出它为止: git checkout your/directories/filename
重置文件(就像很多git命令一样,它没有按照它在这里做的事情命名)。
4)你在本地进行了一些更改,你要确保在你执行git reset或rebase时不会丢失它们:当我经常手动拷贝整个项目( cp -r ../my_project ~/
)时我不确定我是否会陷入混乱或失去重要变化。
5)你正在重塑,但事情变得混乱:
git rebase --abort # To abandon interactive rebase and merge issues
6)将你的git分支添加到你的PS1提示符中(参见https://unix.stackexchange.com/a/127800/10043),例如
该分支是selenium_rspec_conversion
这是奥利弗斯蒂尔关于它如何融合在一起的形象:
链接地址: http://www.djcxy.com/p/109.html上一篇: git branch, fork, fetch, merge, rebase and clone, what are the differences?