我可以使用哪些 git 命令来找出哪些版本的软件受到给定错误的影响?



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

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

  1. "最初的错误是什么时候引入的?">
  2. ">没有此错误的最后一个发布版本是什么?">

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

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

您确实可以使用git bisect来实现此目的; 它可以在各个版本中正常工作,我以前也用过它。 一般的方法是这样的:

  1. 为问题提出一个测试用例。 理想情况下,这可以表示为一个 shell 脚本(例如,./script),如果提交良好,则退出 0,如果提交失败,则退出 1(如果无法测试,则退出 125)。
  2. 找到一个损坏的版本,并调用此提交BAD
  3. 回顾历史记录,猜测可能没有错误的版本。 如果是这样,请再次返回;如果没有,那么您就完成了,并将此提交称为GOOD。 请注意,跳过返回的大量版本是可以的,因为git bisect是 O(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.0v2.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可以使用两个版本执行此操作,但不能使用其他版本执行此操作。

最新更新