在git中,获取与pull相比有何不同,以及merge是如何与rebase不同的?
我只是无法理解这一点。 我一直在网上和书上看很多东西,只是没有留在我的脑海。 有人可以给我以下的虚拟版本:
获取vs拉
fetch
将从远程*分支下载任何更改,更新您的存储库数据,但将本地*分支保持不变。
pull
将执行fetch
并将更改merge
到您的本地分支。
有什么不同? pull
更新你本地分支与拉动分支的变化。 fetch
不会推进您的本地分支。
合并vs rebase
鉴于以下历史:
C---D---E local / A---B---F---G remote
merge
一起加入两个发展历史。 它通过在远程分支之上分叉后重播本地分支上发生的更改并将结果记录在新提交中来实现此目的。 该操作保留了每次提交的血统。
merge
的效果是:
C---D---E local / A---B---F---G---H remote
rebase
将接受您当地分支中存在的提交,并将其重新应用于远程分支之上。 此操作重写您本地提交的祖先。
rebase
的作用是:
C'--D'--E' local / A---B---F---G remote
有什么不同? merge
不会改变提交的祖先。 rebase
重写你的本地提交的血统。
*
这说明假定当前分支是本地分支,并指定为以参数分支fetch
, pull
, merge
,或rebase
是一个远程分支。 这是通常的情况。 例如, pull
将从指定分支下载任何更改,更新您的存储库merge
更改merge
到当前分支中。
取与vs拉
Git获取只是更新您的回购数据,但是一个git pull基本上会执行一次提取,然后合并所提取的分支
'git pull'和'git fetch'有什么区别?
合并vs Rebase
来自Atlassian SourceTree博客,Merge或Rebase:
合并将两条开发线结合在一起,同时保留每个提交历史的祖先。
相比之下,重新定义通过重写来自源分支的更改来统一开发线,以便它们显示为目标分支的子项 - 有效假装那些提交一直写在目标分支的顶部。
此外,请查看Learn Git Branching,这是一个很好的游戏,刚刚发布到HackerNews(链接到文章),并教授许多分支和合并技巧。 我相信在这件事上它将会非常有帮助。
拉vs获取:
我理解这一点的方式是, git pull
就是git fetch
然后是git merge
。 即您从远程分支获取更改,然后将其合并到当前分支中。
合并vs rebase:
合并将按照命令的说法进行; 合并当前分支和指定分支之间的差异(进入当前分支)。 即命令git merge another_branch
将合并another_branch
到当前分支。
一个rebase有点不同,有点酷。 假设你执行命令git rebase another_branch
。 Git将首先找到当前分支和another_branch
之间的最新通用版本。 即分支分歧之前的一点。 然后git会将这个分歧点移到another_branch
的头部。 最后,从最初的分歧点开始,在当前分支中的所有提交都从新的分歧点重放。 这创建了一个非常清晰的历史,分支和合并较少。
然而,这不是没有陷阱! 由于版本历史是“重写的”,因此只有在提交仅存在于本地git库中时才应该这样做。 即:如果您已将提交推送到远程回购,则不要执行此操作。
这本在线书籍中给出的重新定义的解释非常好,带有易于理解的插图。
拉底而不是合并
我实际上使用rebase很多,但通常它与pull相结合:
git pull --rebase
将获取远程更改,然后重新绑定而不是合并。 也就是说,它会重播您上次执行拉动操作时的所有本地提交。 我发现这比使用合并进行正常拉取要干净得多,这将为合并创建额外的提交。
链接地址: http://www.djcxy.com/p/1205.html上一篇: In git how is fetch different than pull and how is merge different than rebase?
下一篇: What's the difference between 'git merge' and 'git rebase'?