git:使用rebase -i重放(大部分)历史记录,保持分支和合并结构不变

时间:2013-04-17 16:44:42

标签: git

我的目标是使用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'存在冲突。

1 个答案:

答案 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'隐藏在某处(使用存储或只保存补丁文件),然后只应用它来修复每个二等分上的工作副本。