【发布时间】:2013-03-14 04:19:57
【问题描述】:
git rebase upstream/master 和 git pull --rebase upstream master 之间有区别吗?如果有,是什么?远程可以是任何远程,不一定是上游。
【问题讨论】:
标签: git git-rebase git-pull
git rebase upstream/master 和 git pull --rebase upstream master 之间有区别吗?如果有,是什么?远程可以是任何远程,不一定是上游。
【问题讨论】:
标签: git git-rebase git-pull
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 (B')B 是旧的 origin/master(在 fetch 更新之前)master 是在 origin/master 之上重放的分支
这与git fetch + git rebase origin/master 的不同之处在于,pull --rebase 命令试图找出哪些提交是真正您的本地提交,以及哪些提交是在较早的提取中来自上游。
为此,它会查看远程跟踪分支的 reflog(在本例中为
origin/master)。此 reflog 表示在origin上的连续git fetch操作的提示,按“最近的优先”顺序。对于每个 reflog 条目(
origin/master@{1},然后是...{2},等等),它会检查该提交是否是当前分支头master的祖先。一旦找到它,它就会选择它作为变基的起点(在上面的示例中为B)。
【讨论】:
git pull --rebase upstream master 类似于git fetch upstream && git rebase upstream/master?
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
pull --rebase 算法以获得更多可见性。
git merge-base --fork-point获得