git - 我可以使用哪些 git 命令来找出软件的哪些版本受到给定错误的影响?
问题描述
我经常需要浏览一个新的 git 存储库(我还不熟悉代码库的那个)并查看一个错误,以了解有关错误原因的更多信息,以及受影响的软件版本由错误。有时我没有任何初始提交信息。例如,我看到一个更改日志,上面写着“在版本 Y 中修复了问题 X”。然后我去克隆代码并开始寻找提交消息和代码更改以寻找线索。在某个时候,我会找到与更改相对应的提交。
现在,我需要回答以下问题:
- “最初的错误是什么时候引入的?”
- “最近发布的没有这个bug的版本是什么?”
这意味着我不仅要处理分支中的提交,还要处理跨版本的提交。我很新git bisect
,我已经看到它在分支中的提交之间用于类似的目的,但我不确定跨版本使用什么好。相当有用的是查看任何给定文件随时间的状态。为此,我使用了gitk
and git log [filename]
。对我来说最困难的部分是大多数 git 工具都是基于的commit hash
,我需要映射到release versions
您将使用哪些 git 命令来完成此任务?
另一种看待它的方式是 - 如果我可以并排查看特定文件的给定部分的最后 5 个发布状态,这将很有用,这样我就可以看到特定代码区域在发布之间是如何演变的. 有没有办法做这样的事情?
解决方案
您确实可以git bisect
用于此目的;它可以在不同版本中正常工作,我之前已经使用过它。一般的做法是这样的:
- 为该问题提出一个测试用例。理想情况下,这可以表示为一个 shell 脚本(例如,
./script
),如果提交是好的,则退出 0,如果提交失败,则退出 1(如果无法测试,则为 125)。 - 找到一个损坏的版本,然后调用这个 commit
BAD
。 - 回顾历史,猜测一个可能没有该错误的版本。如果是,请再次返回;如果没有,那么你就完成了,并调用这个 commit
GOOD
。请注意,跳过返回的大量版本很好,因为git bisect
O(log N)。 - 运行
git bisect start BAD GOOD
。 - 如果你能想出一个 shell 脚本,运行
git bisect run ./script
; 否则,测试每个单独的项目并使用git bisect bad
或git 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
可以使用两个版本执行此操作,但不能使用其他版本。
推荐阅读
- node.js - 将 ISO-8859-6 编码的请求集发送到服务器而不是 Node.js 的替代方法,因为 Node.js 不支持它
- css - 图像旁边显示的文本被缩短(CSS?)
- linux - shell script to copy a file to new file. New file name should as input file name with extension
- razor - 剃须刀网页上的 SMTP
- c# - 从其他机器监听数据时,请求的地址在其上下文中无效
- ios - iOS如何处理图片放大、缩小、拉伸等问题
- yii - 在 Karenderia 食品中添加额外选项
- java - java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler
- javascript - 如果我选择相同的选项从子位置到相同的选项到子位置和相同的搜索,请提醒我它已被选中
- java - 某些手机会删除 SQLite DB