我的目标是使用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'存在冲突。
答案 0 :(得分:1)
为了做你想要的事情,我认为你需要单独重新分配每个分支,然后重新进行合并。
在你的例子中(为简洁起见略微截断),你最终得到的结果如下:
β'-----
/ \
α'-N'-...-P'
/ \
E'-F'-... -J'-R'-S'-T' [fully-testable-branch]
/
A-B-C-D-E--F-G-H-I-J-R-S-T [master]
\ /
\ /
α-N-M---P---
\ /
β ---
(即,您可以在J
创建分支,然后将E..J
重新定位到C
,然后将α..P
重新定位到E'
,然后合并{{ 1}}到你的新分支创建P'
,然后将R'
重新定义到S..T
等等。
一种更简单的方法可能就是将R'
隐藏在某处(使用存储或只保存补丁文件),然后只应用它来修复每个二等分上的工作副本。