我遇到了一个有趣的问题,我的主人试图赶上上游分支。但是我想在沿途的特定点测试我的主人,所以我确保我只在某些点上游重新定位到主人。
假设以下状态:
--F--G--H--> master
/
/
----A--B--C--D--E--I--J--> upstream
我想首先对 C 和 D 进行变基,然后进行测试。所以我这样做:
$ git checkout upstream
$ git checkout D
$ git checkout -b upstreamD
$ git rebase -i master
$ git checkout master
$ git merge upstreamD
这向我展示了 C 和 D 变基。成功变基后,我有:
--F--G--H--C--D--> master
/
/
----A--B--C--D--E--I--J--> upstream
^
upstreamD
然后我删除了上游,因为我在测试时不再需要它,等等(因为我总能得到它)。
$ git branch -d upstreamD
$ git branch -d upstream
$ git remote rm upstream
我进行了测试,因为一切都很好,所以我返回并使用新创建的遥控器抓取我的上游并将其主节点放在上游分支中。
所以,现在我想我有类似的东西(注意主人和上游有更多的提交):
--F--G--H--C--D--K--L--> master
/
/
----A--B--C--D--E--I--J--M--N--> upstream
而且我想再调整一点,所以我执行上面相同的过程:
$ git checkout upstream
$ git checkout J
$ git checkout -b upstreamJ
$ git rebase -i master
但是,现在我要重新设置以下内容:C、E、I、J。奇怪的是我只期待 E、I、J。C 已经在 master 中(即使在不同的 SHA1 下,因为历史不同)。
在http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html它说,我引用:
如果上游分支已经包含您所做的更改(例如,因为您邮寄了一个应用于上游的补丁),那么该提交将被跳过。
我找不到任何解释 git 如何执行此跳过的地方。它如何检查 C 是否已经在 master 中,为什么它决定 C 应该再次变基而 D 不应该?