在git中,提取与拉取有何不同,合并与变基有何不同?


160

我只是不明白这一点。我在网上和书籍上看了很多书,只是有些事情一直在我脑海中浮现。有人可以给我以下的虚拟版本:

  • git fetch vs拉
  • git merge vs rebase

24
我同情提问者。文档和建议非常繁琐,可能的工作流程排列非常繁多,以至于令人非常困惑。一个人只是爆炸了,一个人不知道该问什么,只是不那么明显。
Ed Randall'3

3
为什么不选择pesterella答案作为公认的答案?
Arashsoft '16

@Arashsoft,因为他自2013
-VdeX

Answers:


415

获取与拉动

fetch 将从remote *分支下载所有更改,更新存储库数据,但保持local *分支不变。

pull将执行fetchmerge并将更改附加到您的本地分支机构。

有什么不同? pull使用拉出的分支中的更改更新您的本地分支。A fetch不会提升您的本地分支机构。

合并与变基

根据以下历史记录:

          C --- D --- E当地
         /
    A --- B --- F --- G遥控器

merge将两个发展历史联系在一起。它通过重放分支在远程分支顶部之后在本地分支上发生的更改来完成此操作,并将结果记录在新提交中。此操作保留每次提交的祖先。

a的效果merge将是:

          C --- D --- E当地
         / \
    A --- B --- F --- G --- H遥控器

rebase将接受本地分支中存在的提交,然后将其重新应用到远程分支的顶部。该操作将重写本地提交的祖先。

a的效果rebase将是:

                  本地C'-D'-E'
                 /
    A --- B --- F --- G遥控器

有什么不同?A merge不会更改提交的祖先。A rebase 重写了本地提交的祖先。

*本说明假定当前分支是本地分支,该分支指定为参数fetchpullmerge,或rebase是一个远程分支。这是通常的情况。pull,例如,将从指定分支下载所有更改,更新您的存储库并将merge更改添加到当前分支。


31
到目前为止,这是最简单,最好的解释,无需深入讨论每种做法。谢谢!
Jonathan S. Fisher

3
绝对的黄金答案
ChaseMoskal 2014年

5
希望我能“喜欢”这个答案。也许我只是将其打印并粘贴在墙上。
LarsH 2015年

2
我会说我在stackoverflow中得到的最好的最佳答案,谢谢
Shahab J

1
如果fetch仅从远程分支下载更改并更新存储库数据,而使本地分支保持不变,那么如果工作目录未显示/反映更改,则获取的目的是什么?我最初的问题是,我如何才能看到别人所做的更改,然后决定是否要将它们合并到我的工作目录中(即尝试对其他人的更改进行试验以确保它不会破坏我的工作),但我仍然困惑该怎么办?我应该只是试着做实验/探索,如果有问题,是否要进行硬重置?

28

提取与拉取

Git提取只是更新您的回购数据,但是git pull基本上会执行提取,然后合并提取的分支

'git pull'和'git fetch'有什么区别?


合并与变基

来自Atlassian SourceTree博客,合并或变基

合并将两条发展线放在一起,同时保留了每次提交历史的血统。

相比之下,重新定基础通过重写源分支中的更改来统一开发线,从而使它们显示为目标分支的子级,从而有效地假装这些提交始终写在目标分支的顶部。

另外,请查看Learn Git Branching,这是一个不错的游戏,刚刚发布到HackerNews(链接到post),并讲授了许多分支和合并技巧。我相信这将在此问题上非常有帮助。


谢谢Felips ..因此,如果我从远程进行提取,我的主分支将没有更新?听起来也应该比merga更扎实
techsjs2013

rebase vs merge取决于您的意图,请记住rebase会重写所有提交历史记录。是的,如果仅获取,则不会更改master分支,则必须对其进行合并(或拉取)以应用远程更改
Felipe Sabino

git merge <remote>/<branch>。例如,如果您是master分支,而您的遥控器名为origin,则可以这样做git merge origin/master
Felipe Sabino

所以听起来我应该总是做一个git checkout master git fetch git diff origin / master git rebase origin master
techsjs2013 2013年

8

拉取与提取

我的理解方式是,git pull只需git fetch跟在后面即可git merge。即,您从远程分支获取更改,然后将其合并到当前分支。


合并与变基

合并将按照命令的说明进行;合并当前分支和指定分支之间的差异(合并到当前分支中)。即该命令git merge another_branch将合并another_branch到当前分支中。

rebase的工作方式略有不同,有点酷。假设您执行命令git rebase another_branch。Git首先会在当前分支和之间找到最新的通用版本another_branch。即分支分支之前的点。然后git会将这个发散点移动到another_branch。最后,从新的分歧点开始重播自原始分歧点以来当前分支中的所有提交。这将创建一个非常干净的历史记录,并且分支和合并较少。

但是,这并非没有陷阱!由于版本历史记录是“重写的”,因此仅当提交仅存在于本地git存储库中时,才应执行此操作。也就是说:如果您已将提交推送到远程仓库,则永远不要这样做。

在线书中对重新定基的解释非常好,并带有易于理解的插图。


拉底基而不是合并

我实际上在使用rebase很多,但通常将其与pull结合使用:

git pull --rebase

将获取远程更改,然后重新设置基础,而不是合并。即,它将重播上次执行拉取后的所有本地提交。我发现这比使用合并进行普通拉动要干净得多,这将为合并创建一个额外的提交。


因此,如果我在进行分支工作,并且希望在进行推送之前将其合并回主服务器。我应该结帐大师,然后获得基准修复?
techsjs2013

我仍然
不了解

我认为瘟疫菌的答案所提供的插图非常清楚地表明了这种差异。另外,请查看:git-scm.com/book/en/Git-Branching-Rebasing-解释它做得相当不错(与答案中的链接相同,但对于懒惰的链接则再次给出)。
Steinar

0

合并 -HEAD分支将生成一个新的提交,并保留每个提交历史记录的祖先。如果在同一分支上并行工作的多个人进行合并提交,则历史可能会受到污染。

变基 -重新写一个分支到另一个的变化,而无需创建一个新的提交。代码历史记录是简化的,线性的和可读的,但不适用于请求请求,因为您无法看到某人进行了哪些较小的更改。

git merge在处理基于功能的工作流程或不熟悉变基的情况下,我会使用它。但是,如果我想要更干净,线性的历史记录git rebase,则更合适。有关更多详细信息,请确保查看此合并或变基文章

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.