今天我成功使用git bisect
来追踪引入错误的提交。
当我进入二分行时,我注意到实际上有两个错误,在两个单独的提交中引入。现在我想修复其中一个错误,然后再次使用git bisect
以找到第二个错误。为了做到这一点,我想我应该修复第一个bug,这样bug就会在历史的每个阶段消失,对吧?也就是说,我应该修复引入错误的提交,然后我应该调整应用于错误代码的每个更改。只有这样,我才能开始第二次二分,以便捕获第二个错误。
是否有可能修改过去的提交,以便git仍然知道提交是对现有提交的修改?当然,其他开发人员应该只能提供错误修复,而不是完整的新历史记录。也就是说,任何用新哈希替换旧提交的解决方案都行不通。
答案 0 :(得分:0)
重写已与其他开发人员共享的历史记录通常是不好的做法。您可能应该使用您的错误修正程序进行新的提交,并推送它而不是重写历史记录。
那就是说,是的你可以修改过去的提交。假设我想在这里更改提交B:
* 909debb (HEAD, master) C
* 5a12c7f B
* cfe7820 A
我最喜欢的方法是使用交互式rebase。
% git rebase -i HEAD~2
这将打开一个包含以下内容的编辑器:
pick 5a12c7f B
pick 909debb C
将要更改的提交的pick
更改为edit
:
edit 5a12c7f B
pick 909debb C
写下文件。
% git rebase -i HEAD~2
Stopped at 5a12c7f... B
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
然后进行更改:
% git add <files>
% git commit --amend -m 'Updated B'
% git rebase --continue
现在我的历史看起来像这样:
* bf4a3a7 (HEAD, master) C
* b79ab6f Updated B
* cfe7820 A
答案 1 :(得分:0)
请记住git-bisect,在做出关于树是否好的决定之前,你基本上可以做任何事情。
因此,我想到的一个解决方案是使用git-apply手动应用第一个修补程序(可能使用git-diff生成)的修补程序每次都会运行到工作树中。
您可能需要在每次二分之后使用git reset --hard或类似的方法清除补丁。