13

假设我有一个文件 A.cpp,我注意到文件的第 15 行有一个错误。假设错误是函数上的“const”,它返回指向成员变量的指针,这意味着在函数上使用 const 在技术上是正确的,但在语义上是错误的。我想与进行更改的作者讨论语义。

使用 git,有没有办法找出哪个版本引入了“const”令牌?更具体地说,我想知道是谁介绍了令牌。

“git blame”显示了谁对该行进行了最后一次更改,但我实际上想找到包含令牌的第一个提交。

4

5 回答 5

28

有几种可能的方法来做到这一点。

  • git blame,或更好的图形责备工具(如/gitwebgit gui blame中的责备视图git instaweb)来浏览一行的历史记录,回溯历史直到找到适当的提交。

  • 所谓的“pickaxe search”,即git log -S使用适当的令牌/正则表达式来查找(列出)给定令牌数量发生变化的所有提交(这通常意味着添加或删除给定令牌的位置),例如:

    git log --reverse -p -S'const int foobar' -- A.cpp
    
  • git bisect其中“坏”提交意味着不应该出现的带有“const”的提交(使用例如grep进行测试)。

于 2009-12-08T01:31:20.677 回答
13

git bisect就是你要找的东西。使用此命令,您可以快速找到引入 const 的提交。

您使用 开始该过程git bisect start,然后使用 git 将没有 const 的旧版本标记为好,bisect good将当前版本标记为bisect bad. 然后系统会给你发送到中间的一个版本。您可以检查 evil const 是否存在,并根据它标记该版本的好坏。然后重复该过程,直到找到错误的提交。

于 2009-12-07T22:43:09.217 回答
4

更改可能并不总是在第 15 行A.cpp,因此请使用周围的上下文。说这是一个定义const int foobar

git grep 'const *int *foobar' \
  $(git log --reverse --pretty=format:%H -- A.cpp) -- \
  A.cpp | head -1

这会及时搜索当前分支上的所有提交,A.cpp并找到第一个包含违规模式的提交。输出将是提交的 SHA-1 及其修订版中的匹配行A.cpp

一旦你知道了提交,就可以git show用来学习作者。

于 2009-12-07T23:02:50.653 回答
1

我为此使用QGit,选择感兴趣的行并对其进行过滤,然后您只会看到该行的更改列表。对于单行,不必跳过几个修订。

通过:

  • 在存储库上打开 QGit
  • 打开树视图
  • 查找文件
  • 找线
  • 选择感兴趣的行
  • 按“过滤选定行的修订”按钮,看起来像一个漏斗。
于 2009-12-07T22:40:14.963 回答
1

const如果在您知道的某个提交中该行没有令牌,您可以从那里开始并使用--reversegit-blame 上的标志来查找该行没有const令牌的最后一个修订版。然后只需查看该文件的下一个修订版即可。

于 2009-12-07T22:41:44.850 回答