2013-03-24 333 views

回答

32

git pull --rebasefetch (git fetch)首先更新upstream/master提交。

如果你只是重新编号没有第一次更新upstream/master,你不会得到相同的结果。

我说明它在 “master branch and 'origin/master' have diverged, how to 'undiverge' branches'?


SnakE提到in the commentsgit pull --rebase是不准确git fetch && git rebase origin/master
请参阅 “what does "git pull --rebase" do?

(origin/master) 
    | 
A--B--C (master) 
\ 
    B'--D (actual origin/master after changing B and force pushing) 

什么git pull --rebase确实,在这种情况下,就是:

git fetch origin 
git rebase --onto origin/master B master 

这里:

  • origin/master的是新更新的origin/masterB'
  • B是旧的origin/master(之前获取更新的话)
  • master是分支上的origin/master

这不同于git fetch在+ git rebase origin/masterpull --rebase命令试图找出顶部重播其提交的真的当地一些,并且来自上一次获取的上游。

为此,它会查看远程跟踪分支的reflog(本例中为origin/master)。此reflog代表origin以“最近的第一个”顺序的连续git fetch操作的提示。

对于每个reflog条目(origin/[email protected]{1},然后...{2}等),它会检查该提交是否是当前分支头的一个祖先master。只要它找到一个,它就会选择它作为rebase的起点(上例中的B)。

+10

所以'git pull --rebase upstream master'类似于'git fetch upstream && git rebase upstream/master'? – Dennis 2013-05-10 04:01:59

+0

@丹尼斯,是的。 – VonC 2013-05-10 06:43:50

+2

其实没有。想象一下,你拉过历史“A-B”,并在其上做了一个改变,“A-B-C”。然后其他人修改'B'到'B'',并且推动他们的变化,以便原点现在变成'A-B'-D'。现在,如果你执行'git fetch && git rebase origin/master',那么rebase将会失败并发生冲突。然而'git pull --rebase'会解决这个问题并最终以'A-B'-D-C'结尾。 'pull --rebase'地毯下肯定会发生一些魔法。编辑:[prooflink](http://gitolite.com/git-pull--rebase.html) – SnakE 2015-03-17 18:34:48