57

Is there a difference between git rebase upstream/master and git pull --rebase upstream master, and if so, what? The remote could be any remote, not necessarily upstream.

4

1 回答 1

62

将首先获取(git pull --rebase,更新提交。git fetchupstream/master

如果您只是在没有先更新的情况下进行变基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)

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

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

这里:

  • origin/master 是新更新的origin/master( B')
  • B是旧的origin/master(在 fetch 更新之前)
  • master是要在其上重放的分支origin/master

这与git fetch+的不同之处在于git rebase origin/master,该pull --rebase命令试图找出哪些提交确实是您的本地提交,以及哪些提交是在较早的提取中来自上游的。

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

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

于 2013-03-24T18:04:15.577 回答