在Git中创建无错误的历史记录

时间:2012-10-08 17:02:19

标签: git debugging

今天我成功使用git bisect来追踪引入错误的提交。 当我进入二分行时,我注意到实际上有两个错误,在两个单独的提交中引入。现在我想修复其中一个错误,然后再次使用git bisect以找到第二个错误。为了做到这一点,我想我应该修复第一个bug,这样bug就会在历史的每个阶段消失,对吧?也就是说,我应该修复引入错误的提交,然后我应该调整应用于错误代码的每个更改。只有这样,我才能开始第二次二分,以便捕获第二个错误。

是否有可能修改过去的提交,以便git仍然知道提交是对现有提交的修改?当然,其他开发人员应该只能提供错误修复,而不是完整的新历史记录。也就是说,任何用新哈希替换旧提交的解决方案都行不通。

2 个答案:

答案 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或类似的方法清除补丁。