我的git分支看起来像这样:
master-*-*-*-*-*-*-implement_x
\ \-*-further_foo_fixes_that_depend_on_x
\ \-*-*-further_bar_fixes_that_depend_on_x
\
\-implement_x_rebased
它以这种方式结束,因为我认为我的分支implement_x
将按原样合并到上游,但我被要求将其压缩到单个提交,因此implement_x_rebased
。但是,我已经启动了几个分支,以便在等待implement_x
合并时等待我的工作进一步修复和开发。
现在我想重新调整implement_x_rebased
的进一步工作。我认为这是一个无操作,因为implement_x
和implement_x_rebased
处于完全相同的状态 - 不存在合并冲突,仅应用implement_x
和{{1}之间的更改在further_foo_fixes_that_depend_on_x
之上。等等。然而,似乎git并不那么聪明,并且它试图从基础一路变换 - 引入不必要的合并冲突。
我认为最简单的方法就是将implement_x_rebased
上的进一步修复加入并进行压缩,然后将它们藏匿起来,然后将条带应用到implement_x
,但我很好奇是否有任何正确的方法让git意识到implement_x_rebased
和implement_x
实际上处于同一状态?
答案 0 :(得分:10)
这似乎是--onto
的{{1}}选项的任务。
git rebase
您可能希望查看git rebase manual中的git rebase --onto implement_x_rebased implement_x further_bar_fixes_that_depend_on_x
示例。
答案 1 :(得分:-1)
解决此问题的一种方法是首先使implement_x
和implement_x_rebased
相同,例如:
git checkout implement_x_rebased
git merge implement_x
然后以正常方式合并你的进一步修复。
从代码的角度来看,implement_x
的合并应该是一个NOOP(检查git diff implement_x implement_x_rebased
实际上什么都不产生),但是你正在记录这两个被合并的事实,这将允许你轻松地完成其他任务。
如果它们不完全相同,您可能需要-s ours
选项。这记录了合并已完成而不合并代码。 极度使用。
如果不这样做,您只需使用git rebase
将后来的分支机构重新定位到implement_x_rebased
。
这比挑选樱桃要好 a)你不需要挑选每个单独的提交,记得得到正确的订单等。 b)在语义上,你的git树之后更有意义