git rebase upstream/master vs git pull --rebase upstream master
git rebase upstream/master
和git pull --rebase upstream master
之间是否有区别,如果有,是什么?遥控器可以是任何遥控器,不一定是上游。git rebase upstream/master vs git pull --rebase upstream master
git pull --rebase
将fetch (git fetch
)首先更新upstream/master
提交。
如果你只是重新编号没有第一次更新upstream/master
,你不会得到相同的结果。
我说明它在 “master
branch and 'origin/master
' have diverged, how to 'undiverge' branches'?”
SnakE提到in the comments即git 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/master
(B'
) -
B
是旧的origin/master
(之前获取更新的话) -
master
是分支上的origin/master
这不同于git fetch
在+ git rebase origin/master
的pull --rebase
命令试图找出顶部重播其提交的真的当地一些,并且来自上一次获取的上游。
为此,它会查看远程跟踪分支的reflog(本例中为
origin/master
)。此reflog代表origin
以“最近的第一个”顺序的连续git fetch
操作的提示。对于每个reflog条目(
origin/[email protected]{1}
,然后...{2}
等),它会检查该提交是否是当前分支头的一个祖先master
。只要它找到一个,它就会选择它作为rebase的起点(上例中的B
)。
所以'git pull --rebase upstream master'类似于'git fetch upstream && git rebase upstream/master'? – Dennis 2013-05-10 04:01:59
@丹尼斯,是的。 – VonC 2013-05-10 06:43:50
其实没有。想象一下,你拉过历史“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