9

我是 git 新手,刚刚发现“git bisect”。当您可以使用新编写的单元测试(之前不存在)检查错误时,通常如何使用它?

假设我们有一个包含单元测试的存储库,但是 - 通常 - 它们并不完整。在某些版本中,我们发现某个功能不起作用,但我们知道它在之前的某个版本中存在。不幸的是,该功能没有通过单元测试检查。我现在想做的是:

  1. 编写测试用例(当然首先失败)
  2. 使用此测试用例查找使用 git bisect 引入错误的提交
  3. 更正错误并提交修复(和测试用例)

这个用例有一个问题。当 git bisect 检查旧版本时,刚刚插入的测试用例将不存在,所以我不能用它来检查错误。我可以尝试不提交测试,而是将其保留为本地更改。但是想象一下测试文件在中间的某个版本中发生了更改,我很可能会遇到合并冲突。

那么该怎么办?git bisect 一般如何使用?

4

3 回答 3

12

我通常使用 bisect 来识别何时引入了错误,以便我可以查看单个提交以查找错误原因。当我知道某些东西曾经有效而现在无效时,这很有用。我首先选择或找到一个有效的旧提交,用 标记它,用git bisect good标记头部git bisect bad,然后通过 bisect 工作,直到 git 告诉我引入问题的提交。有时我可以在开始这个过程之前编写单元测试,有时我无法编写它,直到我看到引入错误的代码。

所以,假设我有单元测试,或者在通过 git bisect 过程时需要在每个点使用的其他一些代码或脚本。在我走的时候,藏匿处对持有它很有用。所以,

git stash save blah
git bisect bad (and now I'm on a new commit)
git stash pop
mvn clean test

git stash save blah
git bisect good
git stash pop
mvn clean test

等等。

于 2012-10-06T14:10:54.667 回答
2

首先,在尝试此操作之前,请确保您git status是干净的 - 我建议使用会调用的脚本git reset --hard,因此任何未提交的更改都会丢失。

一种方法是首先将最近测试的源代码复制到存储库历史中从未跟踪过的某个位置(或存储库之外的某个位置)。然后编写一个脚本:

  1. 将最近的测试复制到源代码树中
  2. 运行测试,保存返回码。
  3. 是否git reset --hard清除步骤 1 中的更改
  4. 使用从 2 保存的返回码退出。

然后,在将两个提交标记为好和坏以git bisect从某个地方开始之后,您可以使用它git bisect run YOUR-SCRIPT来查找最近的单元测试可能失败的第一个提交。

这种方法本质上是文档中建议的git bisect run方法,其中说:

您可能经常会发现,在对分会话期间,您希望进行临时修改(例如,头文件中的 s/#define DEBUG 0/#define DEBUG 1/,或“没有此提交的修订需要应用此补丁才能解决此二分法不感兴趣的另一个问题”)应用于正在测试的修订版。

为了应对这种情况,在内部 git bisect 找到下一个要测试的修订后,脚本可以在编译前应用补丁,运行真正的测试,然后确定修订(可能带有所需的补丁)是否通过测试和然后将树倒回原始状态。最后,脚本应该以真实测试的状态退出,让“git bisect run”命令循环确定 bisect 会话的最终结果。

于 2012-10-06T14:12:49.683 回答
1

您没有提到您使用的是哪种技术,所以我将使用 Ruby 作为示例,这是我最熟悉的。不过,同样的原则也应该适用于其他技术。

  1. 将最新的测试文件放在项目目录之外。在这里,我假设它已开启/tmp/my_test.rb

  2. 在您的存储库中,创建一个小的 shell 脚本,例如test_runner.sh

    #!/usr/bin/env sh    
    cp -f /tmp/my_test.rb test/my_test.rb # This will potentially overwrite some old test file
    ruby test/my_test.rb # Change for whatever test runner you use
    test_result=$?
    git checkout test/my_test.rb # Undoes any changes that might have been made
    exit $test_result
    
  3. 将提交标记为好/坏,通常使用bisect.

  4. 在 git 为您找到错误时,使用git bisect run test_runner.sh并去喝杯咖啡。

于 2012-10-06T14:16:05.087 回答