使用git在文件的特定行上找到令牌的第一个介绍

pax*_*977 13 git version-control blame

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

使用git,有没有办法找出引入"const"令牌的修订版?更具体地说,我想知道谁引入了令牌.

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

Jak*_*ski 27

有几种可行的方法.

  • git blame,或者更好的图形怪工具(比如/ gitweb中git gui blame的责备视图git instaweb)来浏览一行的历史记录,回到历史记录中直到找到合适的提交.

  • 所谓的"pickaxe搜索",即git log -S使用适当的token/regexp,来查找(列出)给定令牌数量发生变化的所有提交(通常意味着添加或删除给定令牌的位置),例如:

    git log --reverse -p -S'const int foobar' -- A.cpp
    
    Run Code Online (Sandbox Code Playgroud)
  • git bisect 其中"坏"提交意味着具有'const'的那个不存在的地方(使用例如grep测试).


nac*_*tin 13

你正在寻找git bisect.使用此命令,您可以快速找到引入const的提交.

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

  • 如果你可以编写一个简单的脚本,如果常量存在则退出1(即"坏"状态),调用`git bisect run myscript`,坐下来享受git为你做的工作...... (4认同)