使用 Git 进行调试

2025-06-07

使用 Git 进行调试

当你在开发一个大型项目时,你可能会发现代码中存在一些 bug,导致开发进度无法继续。该如何修复它们呢?

你可以先手动查看提交历史记录,但这会是一个非常繁琐的过程。好在 Git 提供了多种工具,可以在出现问题时帮助你查找 bug 或罪魁祸首。

Git Blame

$ git blame <file_path/file_name>
命令可帮助您查找导致项目中特定文件中出现错误的特定代码行的提交。它还可以确定提交的作者,从而更轻松地获取有关代码的更多信息。git blame

您可以使用-L选项来限制行输出范围。

$ git blame -L 11,21 new_file
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 11) def new
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 12) @article = Article.new
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 13) end
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 14) def edit
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 15) @article = Article.find(params[:id])
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 16) end
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 17) def create
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 18) @article = Article.new(article_params)
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 19) if @article.save
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 20) redirect_to @article
^95d69a196b5c7 (Jhon Smith  2018-05-18 13:04:22 +0200 21) else

通过跟踪提交的部分 SHA-1,您可以轻松查看特定代码行的修改者、修改时间以及如何修改。请注意,^前缀显示的是初始提交中创建且此后一直保持不变的行。

如果代码片段是从其他地方复制过来的,可以使用-C选项来找出它们的原始来源。它会告诉你原始作者,并且无论之后是否进行了重构,它都会提交。

$ git blame -L -C 11,21 <file_path/file_name>

git blame当你能推测出问题的原因时,这很有帮助。如果你不知道如何恢复工作状态怎么办?这时就git bisect需要用到它了。

Git Bisect

Agit bisect是一个调试工具,它通过自动二进制搜索来找出项目中哪个特定的提交引入了 bug 或问题你不知道项目中哪个文件包含这个 bug。

如果您不知道哪里出了问题,并且自上次您知道代码运行正常以来已经有大量提交,那么您可能会寻求git bisect帮助。

git-bisect

它的作用git bisect是,通过二分查找法测试git 提交树,将其划分为“好的”提交(无 bug 的提交)和“坏的”提交。根据测试结果,Git 会遍历最近的提交,识别它们,直到找到罪魁祸首。这被称为二分查找算法

如果有多个错误,则需要对每个错误执行二进制搜索。

这是如何运作的?

  1. 首先我们先用二分查找模式来找bug $ git bisect start:。
  2. 接下来,你需要查找一个一切正常且正常运行的提交。为此,我们先检查提交历史记录,找到你需要的内容$ git log --oneline

--oneline 选项仅显示 git 提交的名称。

$ git log --oneline
f11c599 Removed unnecessary lines
95d69a1 Added article tests
3171aa2 Enabled editing articles
95d69a1 Added articles
  1. 标记最旧的“好”提交 SHA-1 $ git bisect good 95d69a1:。
  2. 分配“好”标签后,您需要找到一个“坏”提交来划分提交树,以便 Git 能够应用二分搜索算法。由于您知道最新的提交存在错误,因此将其指定为“坏”提交$ git bisect bad f11c599
  3. 一旦您为搜索分配了初始和最终指针,Git 就会引导您浏览提交历史记录并标记“好”和“坏”提交。
  4. 这个过程一直持续,直到你成功找到第一个“错误”的提交,也就是问题的根源。现在,你可以通过执行以下命令退出 git 二分查找模式$ git bisect reset

Git Grep

$ git grep <keyword>
命令允许您高效快速地在项目中搜索源代码中任意文件中的字符串或正则表达式。==它避免了逐个文件搜索。==git grep .gitignore

GREP代表全球表达式打印

附加选项:

  • -n--line-number:打印出 Git 找到匹配的行号。
  • -ior --ignore-case:忽略搜索关键字和文件之间的大小写差异。
  • -c--count:显示在文件中找到的与输入关键字匹配的次数。
  • -p--show-function:显示搜索关键字的上下文。
  • --and:确保同一行文本中有多个匹配。

概括

git blame如果您知道错误代码的位置,那么这是一个很好的工具。另一方面,如果您的存储库相当庞大,并且有大量的提交历史记录,导致很难找到错误,git bisect那么这是一个很好的选择。或者,您可以使用 轻松地在项目中搜索字符串或正则表达式git grep


三种调试工具为您提供三种不同的问题修复方法。如果您需要帮助解决问题,不妨联系Kolosek!我的团队很乐意为您提供帮助!

本文最初发表于Kolosek Blog

文章来源:https://dev.to/neshaz/debugging-with-git-eba
PREV
Git 命令终极教程(第二部分)
NEXT
Git 标签 Git 中标记发布的教程