git blame
对于修改和添加的行非常有用,但是如何查找特定先前提交中存在的行最终被删除了呢?我考虑使用 bisect
,但我希望有更方便的方法。
(在你问之前:在这种情况下,我只是运行了一个 git log -p
命令,并搜索了代码行,结果发现 (a) 一些白痴在上一个提交中刚刚删除了重要的行,(b) 那个白痴就是我。)
git blame
对于修改和添加的行非常有用,但是如何查找特定先前提交中存在的行最终被删除了呢?我考虑使用 bisect
,但我希望有更方便的方法。
(在你问之前:在这种情况下,我只是运行了一个 git log -p
命令,并搜索了代码行,结果发现 (a) 一些白痴在上一个提交中刚刚删除了重要的行,(b) 那个白痴就是我。)
git log -S <string> path/to/file
这会显示引入或删除该字符串实例的提交。还有-G<regex>
,可以使用正则表达式来实现同样的功能!请参阅man git-log
并搜索-G
和-S
选项,或者了解更多关于pickaxe(这些功能的友好名称)的信息。
-S
选项也在git-blame
的页眉中提到,在描述部分中给出了一个使用git log -S...
的示例。
-c
选项。 - yunzengit log -S ... path/to/directory
可以正常工作。 - Florian Brucker我认为你真正想要的是
git blame --reverse START..END filename
从manpage页面得知:
向前遍历历史,而非向后。不是显示一行出现在哪个修订版本中,而是显示该行存在的最后一个修订版本。这需要像START..END这样的一系列修订版本范围,其中路径在START中存在责任。
使用git blame reverse
,你可以找到该行出现的最后一次提交。但您仍然需要获取其之后的提交。
您可以使用以下命令显示反向的git日志。第一个显示的提交将是该行最后一次出现的时间,下一个提交将是更改或删除它的时间。
git log --reverse --ancestry-path COMMIT^..master
git blame --reverse
将显示最后一次按时间顺序排列的合并之前的修订版本,而不是最初做出决定放弃该行的初始合并之前的修订版本。是否有一种方法可以找到该行停止存在的最早修订版本,而不是最近的修订版本? - rakslice仅仅是为了补充 Cascabel的回答:
git log --full-history -S <string> path/to/file
我和这里提到的问题一样,但是事实证明,这行代码缺失是因为从一个分支合并提交被撤销,然后再次合并,有效地删除了这行代码。 --full-history
标志可以防止跳过这些提交。
对于隐藏在合并提交中的更改
合并提交自动从Git日志输出中隐藏其更改。无论是pickaxe还是reverse-blame都无法找到更改。因此,我想要的行已经被添加了,然后又被删除了,我想找到删除它的合并。文件git log -p -- path/file
历史记录仅显示该行被添加。以下是我发现的最佳方法:
git log -p -U9999 -- path/file
搜索更改,然后向后搜索“^ commit”-第一个“^ commit”是文件上次拥有该行的提交。第二个“^ commit”在它消失之后。第二个提交可能是删除它的提交。 -U9999
旨在显示整个文件内容(在每次更改文件后),假设您的文件最多有9999行。
通过蛮力查找任何相关的合并(将每个可能的合并提交与其第一个父提交进行比较,运行大量提交)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(我试图更限制修订过滤器,但遇到问题,不建议这样做。我正在查找的添加/删除更改位于合并在不同时间和A ... B合并到主线路时未包括的不同分支上。)
显示具有这两个提交的Git树(以及大量复杂的Git历史记录已删除):
git log --graph --oneline A B ^$(git merge-base A B)
(A是上面的第一个提交,B是第二个提交)
显示A的历史记录和B的历史记录,减去A和B的历史记录。
备用版本(似乎更线性地显示路径,而不是常规的Git历史记录树-但我更喜欢常规的git历史记录树):
git log --graph --oneline A...B
三个点,不是两个点 - 三个点意味着“r1 r2 --not $(git merge-base --all r1 r2)”。它是一组从r1(左侧)或r2(右侧)之一可达的提交,但不能从两者都可达。- 来源:“man gitrevisions”
如果你喜欢使用GUI界面,免费软件DeepGit是个不错的选择。在旧版本文件的Blame视图中,通过拖动左侧行号来选择感兴趣的行。文件顶部的日志将被筛选,只显示与这些行相关的提交记录。最上面的提交记录将是它们的删除记录。
或者,如果查看的是之后版本的文件,其中这些行已经不存在了,通过拖动左侧边距选择已删除行周围的行。上方的提交日志将被筛选为这些行,并且将包括删除所选行之间的提交记录。点击Diff按钮并逐个浏览筛选后的修订版本,找到删除操作记录。
git log -S<string> /path/to/file
йңҖиҰҒдҪҝз”Ё-c
жҲ–-cc
еҸӮж•°жқҘжҳҫзӨәеҗҲ并пјҲеҶІзӘҒпјүжңҹй—ҙзҡ„еҲ йҷӨж“ҚдҪңгҖӮ - cfi