假设我有一个文件 A.cpp,我注意到文件的第 15 行有一个错误。假设错误是函数上的“const”,它返回指向成员变量的指针,这意味着在函数上使用 const 在技术上是正确的,但在语义上是错误的。我想与进行更改的作者讨论语义。
使用 git,有没有办法找出哪个版本引入了“const”令牌?更具体地说,我想知道是谁介绍了令牌。
“git blame”显示了谁对该行进行了最后一次更改,但我实际上想找到包含令牌的第一个提交。
假设我有一个文件 A.cpp,我注意到文件的第 15 行有一个错误。假设错误是函数上的“const”,它返回指向成员变量的指针,这意味着在函数上使用 const 在技术上是正确的,但在语义上是错误的。我想与进行更改的作者讨论语义。
使用 git,有没有办法找出哪个版本引入了“const”令牌?更具体地说,我想知道是谁介绍了令牌。
“git blame”显示了谁对该行进行了最后一次更改,但我实际上想找到包含令牌的第一个提交。
有几种可能的方法来做到这一点。
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进行测试)。
git bisect就是你要找的东西。使用此命令,您可以快速找到引入 const 的提交。
您使用 开始该过程git bisect start
,然后使用 git 将没有 const 的旧版本标记为好,bisect good
将当前版本标记为bisect bad
. 然后系统会给你发送到中间的一个版本。您可以检查 evil const 是否存在,并根据它标记该版本的好坏。然后重复该过程,直到找到错误的提交。
更改可能并不总是在第 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
用来学习作者。
我为此使用QGit,选择感兴趣的行并对其进行过滤,然后您只会看到该行的更改列表。对于单行,不必跳过几个修订。
通过:
const
如果在您知道的某个提交中该行没有令牌,您可以从那里开始并使用--reverse
git-blame 上的标志来查找该行没有const
令牌的最后一个修订版。然后只需查看该文件的下一个修订版即可。