git rebase upstream/master vs git pull --rebase upstream master

Den*_*nis 41 git git-pull git-rebase

有没有之间的差异git rebase upstream/mastergit pull --rebase upstream master,如果是这样,是什么?遥控器可以是任何遥控器,不一定是上游遥控器.

Von*_*onC 43

git pull --rebase取(git fetch)第一,更新upstream/master提交.

如果您只是在没有首次更新的情况下进行 rebase upstream/master,则不会得到相同的结果.

我在" master分支和' origin/master分歧,如何'分散'分支'中说明它 "


SnakE 在评论中提到git pull --rebase并不完全正确 git fetch && git rebase origin/master.
看" 做什么" git pull --rebase"做什么? "

(origin/master)
   |
A--B--C (master)
 \ 
  B'--D (actual origin/master after changing B and force pushing)
Run Code Online (Sandbox Code Playgroud)

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

git fetch origin
git rebase --onto origin/master B master
Run Code Online (Sandbox Code Playgroud)

这里:

  • origin/master是新更新的origin/master(B')
  • B是旧的origin/master(在获取更新之前)
  • master 是重播的分支 origin/master

这不同于git fetch+ git rebase origin/master,该pull --rebase命令试图找出哪些提交是真正本地的,并且已经在前面的获取来自上游.

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

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

  • 所以`git pull --rebase upstream master`类似于`git fetch upstream && git rebase upstream/master`? (11认同)
  • 其实没有.想象一下,你把历史"AB"拉到了上面,并在它上面做了一个改变,`ABC`.然后有人修改了'B`到'B'并且推动了他们的改变,使得起源现在是'A-B'-D`.现在,如果您执行`git fetch && git rebase origin/master`,则rebase将因冲突而失败.然而,`git pull --rebase`会弄明白并最终得到'A-B'-DC`.在"pull --rebase"中,一些魔力绝对发生在地毯下.编辑:[prooflink](http://gitolite.com/git-pull--rebase.html) (2认同)
  • 魔术可以直接在`git merge-base --fork-point`中获得。 (2认同)