在git中如何获取不同于拉和合并与rebase不同?
我只是无法理解这一点。 我一直在网上和书上看很多东西,只是不在我的脑海里。 有人可以给我下面的虚拟版本:
- git fetch vs pull
- 混帐vs rebase
取vs vs拉
fetch
将从远程*分支下载任何更改,更新您的存储库数据,但保持您的本地*分支不变。
pull
将执行一个fetch
, merge
更改merge
到您的本地分支。
有什么不同? pull
更新你本地分支与拉的分支变化。 fetch
不会推进您的本地分支。
合并vs rebase
鉴于以下历史:
C --- D --- E地方 / A --- B --- F --- G遥控器
merge
两个发展历史。 它通过在远程分支之上分叉之后重播本地分支上发生的更改,并将结果logging在新的提交中。 这个操作保留了每个提交的祖先。
merge
的效果是:
C --- D --- E地方 / \ A --- B --- F --- G --- H遥控器
rebase
会接受你当地分支中存在的提交,并将它们重新应用到远程分支之上。 这个操作重写你的本地提交的祖先。
rebase
的作用是:
C' - D' - E'地方 / A --- B --- F --- G遥控器
有什么不同? merge
不会改变提交的祖先。 一个rebase
重写你的本地提交的血统。
*
这个解释假定当前分支是一个本地分支,并且被指定为fetch
, pull
fetch
, merge
或重定位参数的分支是一个远程分支。 这是通常的情况。 pull
,例如,将从指定的分支下载任何更改,更新您的存储库, merge
更改merge
到当前分支。
取vs vs拉
Git获取只是更新您的回购数据,但一个GIT拉将基本上执行一个提取,然后合并分支拉
'git pull'和'git fetch'有什么区别?
合并vs Rebase
来自Atlassian SourceTree博客, 合并或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将首先find当前分支和another_branch
之间的最新通用版本。 即分支分歧之前的一点。 然后git会将这个分歧点移到another_branch
的头部。 最后,从最初的发散点开始,当前分支中的所有提交都从新的发散点重放 。 这创build了一个非常清晰的历史,分支和合并较less。
然而,这不是没有陷阱! 由于版本历史是“重写的”,所以只有在提交只存在于你本地的git仓库时才应该这样做。 即:如果您已将提交推送到远程回购,则不要执行此操作。
这个在线书籍中给出的重新定义的解释是相当不错的,带有易于理解的插图。
拉底而不是合并
我实际上使用rebase很多,但通常是与拉组合:
git pull --rebase
将获取远程更改,然后重新绑定而不是合并。 也就是说,它会重播你上一次执行拉的所有本地提交。 我发现这比使用合并进行正常拉取要干净得多,这将会为合并创build一个额外的提交。