我可以使用 git 来查找修复分支所需的提交吗?

Can I use git to find which commit is needed to fix a branch?

我有一棵 git 树,它看起来像这样:

master (test passes)
|
|
|  stable (test fails)
|   |
|   /
+---
|

有一个测试在 运行 对 stable 分支时失败,但在 运行 对 master 分支时通过。由于它是一个复杂的多进程测试,因此很难调试。

我可以使用 git 来查找主分支中的哪个提交可以被挑选到稳定分支以修复测试吗?

两个分支上都有数百个提交,因此手动执行会很痛苦。

There are many hundreds of commits on both branches so doing it manually would be painful.

这是 git-bisect 的工作。

开始平分,git bisect start

你知道它在稳定版上失败了,把它标记为坏的。 git bisect bad stable.

你知道它正在通过 master,标记为好:git bisect good master

Bisect 现在将 select 两者之间的提交并检查它。 运行 你的测试。如果通过,git bisect good。它失败了,git bisect bad.

Bisect 将选择另一个提交。做同样的事情。

重复直到 Git 找到开始失败的提交。因为它正在做一个 binary search,搜索数百个提交应该需要大约 20-30 个提交。您可以通过编写脚本来执行构建和测试并将其传递给 git bisect run my_script <args>.

来自动化该过程

这取决于单个提交是失败的原因。如果您在开发过程中没有始终如一地进行测试,则可能会有一个更新的提交再次引入错误(回归)。您可能需要从更新的“好”提交开始再次一分为二。

有关详细信息,请参阅 git-bisect documentation. They provide very clear instructions. Also this answer