git pull VS git fetch vs git rebase


294

说的另一个问题git pull就像一个git fetch+ git merge

但是git pullVS git fetch+和有git rebase什么不一样?


2
有人应该清理链接...我很惊讶另一个问题获得了多少票。
xenoterracide

13
@xeno:我认为这只是人数的多少“我也有这个问题”
bobobobo 2010年

44
有一天,我会抽出时间真正阅读git文档,但是直到那时,我都会对这些类型的问题投我的票
Eran Medan 2012年

Answers:


336

从您的问题中可以明显看出,您实际上只是在询问git merge和之间的区别git rebase

因此,假设您处于一般情况下-您已经在master分支上完成了一些工作,并且从origin分支中拉了过来,这也已经完成了一些工作。提取后,情况如下:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

如果此时合并(git pull的默认行为),并且假设没有任何冲突,那么最终结果是:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

另一方面,如果您进行了适当的变基,您将得到以下结果:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

在这两种情况下,您的工作树的内容都应该相同。您刚刚创造了一段不同的历史。重新设置将重写您的历史记录,使其看起来就像您已在原始原始主分支(R)上提交,而不是在最初提交的位置(H)上提交。如果其他人已经从master分支中撤出,则永远不要使用rebase方法。

最后,请注意,您可以git pull通过将config参数设置branch.<name>.rebase为true 来实际设置给定分支使用rebase而不是merge 。您也可以使用进行一次拉动git pull --rebase


39
如果在某人已经从您的主分支撤出后重新设置基础,该怎么办?那会破坏回购吗?
Didier A.

12
您如何知道是否有人从您的主分支中撤出?
弗兰克

29
如果您不确定某人没有,则应假定他们有。
克里斯·唐尼

4
我只是在想,除非您也要在原点/母版以外的其他地方推送更改,否则我看不到有人会撤消有问题的更改的问题,因为如果您已经将这些更改推送到原点/主人,一开始就没有任何要调整的基础。在我看来,警告仅在您遇到比X-> origin / X更复杂的情况下才有意义,但是我可能是错的。如果有人知道我正在忽略的情况,请分享。
neverfox 2013年

1
@SteveChambers不,那不是结果。这些行仅表示提交祖先,即A是B的父级。对于Q或B是否在第一时间没有任何暗示。所有这些操作都基于提交图,而不是时间。Rebase只是移植了一些提交,无论提交时间戳是什么,结果都显示出来了。
卡斯卡贝尔2013年

9

TLDR:

git pull是喜欢跑步 git fetch,然后git merge
git pull --rebase就像git fetchgit rebase

为了回应您的第一句话,

git pull就像一个git fetch+ git merge

“在默认模式下,git pull是git fetch后跟 git mergeFETCH_HEAD的简写形式”。更精确地讲,以给定的参数git pull运行git fetch,然后调用git merge以将检索到的分支头合并到当前分支中

(参考:https : //git-scm.com/docs/git-pull


对于第二个陈述/问题:

“但是git pullVS git fetch+有什么区别?git rebase

同样,来自同一来源:
git pull --rebase

“使用--rebase,它将运行git rebase而不是git merge。”


现在,如果你想问

“之间的差mergerebase

也可以在这里回答:
https : //git-scm.com/book/en/v2/Git-Branching-Rebasing
(更改版本历史记录方式之间的区别)


2
我想提一提,大多数时候“ git pull --rebase”就像“ git fetch然后git rebase”一样-但并非总是如此。在某些情况下,“ git pull --rebase”的作用还要大一些。请在此处查看此经常引用的示例:gitolite.com/git-pull--rebase
Daniel K.19年

1
非常感谢您的回答。我真的很了解git fetch + git rebase命令的工作方式。从现在开始,我们的git树上不再存在或多或少的冲突:)
Travis Le
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.