在git中如何获取不同于拉和合并与rebase不同?

我只是无法理解这一点。 我一直在网上和书上看很多东西,只是不在我的脑海里。 有人可以给我下面的虚拟版本:

  • git fetch vs pull
  • 混帐vs rebase

取vs vs拉

fetch将从远程*分支下载任何更改,更新您的存储库数据,但保持您的本地*分支不变。

pull将执行一个fetchmerge更改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重写你的本地提交的血统。

*这个解释假定当前分支是一个本地分支,并且被指定为fetchpull fetchmerge或重定位参数的分支是一个远程分支。 这是通常的情况。 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一个额外的提交。