我的目标是使用 git bisect。我受到以下事实的阻碍,即显然接近引入我要纠正的问题的提交,我引入了另一个小错误,导致许多邻居提交无法测试。
这第二个错误是一个微不足道的错误。后来我更正了它几次提交。
我想做的是:
git checkout master
git checkout -b fully-testable-branch
git rebase -i initial-good-bisect-point
然后从提交列表中删除引入第二个错误的提交。我期待并准备好处理代码和历史领域的一些冲突。
然后,如果一切顺利(它应该——这个项目中的大多数提交都是可测试的)我可以再次平分,这次在完全可测试分支的尖端和初始良好平分点之间,找到并研究问题提交,结帐大师,然后从那里开始。
如果历史是线性的,这会很好。(我以前做过。)然而, git rebase -i 所做的是线性化非线性历史。反过来,这会产生许多已经解决的冲突(通常不是我,通常是我在其他机器上,所以我的 rerere 缓存没有多大帮助)。这些冲突存在于我的程序的一部分中,既与我试图确定的错误无关,也与我已确定的次要错误有关。
我对不得不重新解决这些冲突并不感到兴奋。第一次做这项工作很乏味且容易出错!
那么,有没有办法让 git rebase -i 重放历史,包括分支和合并?还有另一个命令可以吗?我是否将这一切都错了,如果是这样,我应该尝试什么?
编辑:根据请求,这是历史的简化版本。
A-B-C-D-E--F-G-H-I-J-R-S-T
\ /
\ /
α-N-M---P---
\ /
β /
\ /
γ
在 P 处解决了一些冲突,在 D 处创建了小错误。这段历史被扁平化为:
A-B'-C'-D'-E'-F'-α'-β'-γ'-N'-M'-P'-F'-G'-H'-I'-J'-Z'
因此在回放历史时,在 N'、M' 和 P' 处存在冲突。