首页 > 解决方案 > 我可以使用哪些 git 命令来找出软件的哪些版本受到给定错误的影响?

问题描述

我经常需要浏览一个新的 git 存储库(我还不熟悉代码库的那个)并查看一个错误,以了解有关错误原因的更多信息,以及受影响的软件版本由错误。有时我没有任何初始提交信息。例如,我看到一个更改日志,上面写着“在版本 Y 中修复了问题 X”。然后我去克隆代码并开始寻找提交消息和代码更改以寻找线索。在某个时候,我会找到与更改相对应的提交。

现在,我需要回答以下问题:

  1. “最初的错误是什么时候引入的?”
  2. “最近发布的没有这个bug的版本是什么?”

这意味着我不仅要处理分支中的提交,还要处理跨版本的提交。我很新git bisect,我已经看到它在分支中的提交之间用于类似的目的,但我不确定跨版本使用什么好。相当有用的是查看任何给定文件随时间的状态。为此,我使用了gitkand git log [filename]。对我来说最困难的部分是大多数 git 工具都是基于的commit hash,我需要映射到release versions您将使用哪些 git 命令来完成此任务?

另一种看待它的方式是 - 如果我可以并排查看特定文件的给定部分的最后 5 个发布状态,这将很有用,这样我就可以看到特定代码区域在发布之间是如何演变的. 有没有办法做这样的事情?

标签: git

解决方案


您确实可以git bisect用于此目的;它可以在不同版本中正常工作,我之前已经使用过它。一般的做法是这样的:

  1. 为该问题提出一个测试用例。理想情况下,这可以表示为一个 shell 脚本(例如,./script),如果提交是好的,则退出 0,如果提交失败,则退出 1(如果无法测试,则为 125)。
  2. 找到一个损坏的版本,然后调用这个 commit BAD
  3. 回顾历史,猜测一个可能没有该错误的版本。如果是,请再次返回;如果没有,那么你就完成了,并调用这个 commit GOOD。请注意,跳过返回的大量版本很好,因为git bisectO(log N)。
  4. 运行git bisect start BAD GOOD
  5. 如果你能想出一个 shell 脚本,运行git bisect run ./script; 否则,测试每个单独的项目并使用git bisect badgit bisect good测试它(或者git bisect skip如果它无法测试)。

这将导致提交,调用它RESULT。如果您想找到包含它的版本,请运行git describe --tags --contains RESULT,它会查看标签以显示包含它的版本。如果您想查找未包含它的git describe --tags RESULT最新版本,请运行 ,它将显示未包含它的最新版本。请注意,将有额外的数据来指定您的提交,但您可以忽略它。例如,您在这里感兴趣的版本是v2.28.0: v2.28.0-310-gc4d891dc21

在下一版本的 Git 中,将有一个选项--first-parent来跟踪第一个父级,如果您有一个基于 PR 的工作流程,其中 PR 必须通过测试但单个提交不需要工作,这将很有帮助。

相反,如果你想知道哪个提交修复了一个提交,你可以反转你的 shell 脚本的意义,将参数的顺序交换为git bisect start,并git bisect good在提交被破坏和git bisect bad提交良好时使用。

如果确实只是想查看给定文件的历史记录,则可以使用git log -p REVISION -- FILENAME. 没有并排视图;这是您需要使用某种外部工具来完成的事情。 vimdiff可以使用两个版本执行此操作,但不能使用其他版本。


推荐阅读