【问题标题】:Git history - find lost line by keywordGit历史 - 按关键字查找丢失的行
【发布时间】:2024-01-23 12:41:01
【问题描述】:

我在 Git 存储库的某个地方有一行包含“Foo”这个词,之前有几百次提交。

如果有什么方法可以找到它上次所在的修订号?

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    这可以通过gitlogpickaxe (-S) 选项解决

     git log -SFoo -- path_containing_change
    

    (您甚至可以添加时间范围:--since=2009.1.1 --until=2010.1.1

    -S<string>
    

    查找引入或删除&lt;string&gt; 实例的差异。
    请注意,这与仅出现在 diff 输出中的字符串不同;有关详细信息,请参阅gitdiffcore(7) 中的镐条目。

    diffcore-pickaxe
    

    此转换用于查找表示涉及指定字符串的更改的文件对。
    diffcore-pickaxe 正在使用时,它会检查是否存在“原始”端具有指定字符串而“结果”端没有指定字符串的文件对。
    这样的文件对表示“出现在此变更集中的字符串”。
    它还检查丢失指定字符串的相反情况。


    2014 年更新:

    从那以后,你可以做(​​来自nilbusanswer):

    git log -p --all -S 'search string'
    git log -p --all -G 'match regular expression'
    

    这些日志命令列出添加或删除给定搜索字符串/正则表达式的提交,(通常)较新的优先。
    -p (--patch) 选项会导致相关差异显示在添加或删除模式的位置,以便您可以在上下文中看到它。

    找到添加了您正在查找的文本的相关提交(例如8beeff00d),找到包含该提交的分支:

    git branch -a --contains 8beeff00d
    

    (我在“How to list branches that contain a given commit?”中引用了最后一条命令)

    【讨论】:

    • 自我说明:--pickaxe-all-S 之间的关系可以通过 lists-archives.org/git/…article.gmane.org/gmane.comp.version-control.git/34909 更好地理解
    • Notebis:pickaxe 选项是我在关注 Jefromi 的答案时了解到的另一个命令/选项:*.com/questions/2700140/…:去投票给他的原始答案;)“非常有用”,因为他的答案通常是。 (*.com/users/119963/jefromi)
    • 非常感谢,谢谢!相反,我总是知道如果您遇到问题,则无需我回答。
    • @Jefromi:“我一直都知道,如果你遇到问题,我就不需要回答了。”。嗯……关于那个。检查并没有什么坏处;)我仍然在这里学习。例如,*.com/questions/2846843/… 可能会受益于您的专业知识。
    • 好吧,每条规则都有例外;我会检查,但很少需要!
    【解决方案2】:

    最坏的情况,使用git bisectgrep

    【讨论】:

      最近更新 更多