【问题标题】:git log for a single line -L without showing diff or patch?git log 单行 -L 不显示差异或补丁?
【发布时间】:2018-01-17 03:14:33
【问题描述】:

我试图弄清楚文件中的哪一行被引入以及在哪些提交中被更改。

我可以查看这些行的历史记录(文件 example.txt 中的第 10 行):

git log -L 10,11:example.txt

但是,对于每个日志条目,它都包含一个“差异”或“补丁”(我还不确定其中的区别),就像我运行一样:

git log -p

这使得输出更难阅读 - 我只想查看提交消息列表及其 id 以了解更改了我感兴趣的行的提交。

例如,通常 git 日志可以通过使用 --pretty 格式来简化,使我们能够阅读干净的提交消息列表以找到我们感兴趣的信息。例如,我使用 --oneline经常选择:

git log --oneline

然而,这显示了完整的日志 - 我们想要过滤它以仅显示更改感兴趣行的提交。像下面这样的东西会很棒,但漂亮的单行格式似乎不能与 -L 标志结合使用:

git log --oneline -L 10,11:example.txt

我尝试了git log documentation 中选项和参数的各种组合,但没有找到任何可行的方法。

是否有其他人面临此问题或对可行的方法有任何想法?

感谢您阅读本文

【问题讨论】:

  • 给出基于命令行的答案远远超出了我的薪酬等级,但我可以告诉你,大多数具有 Git 集成的 IDE(例如 IntelliJ、Eclipse)可以用信息注释源文件中的每一行关于谁最后触及给定线。实际上,我宁愿以图形方式而不是从命令行获取这些信息。
  • 从那以后找到this post 一个答案,建议正常使用 git log -L 命令并使用 egrep 提取提交。还不知道怎么...

标签: git


【解决方案1】:

正如VonChere所提到的,

git log -s -L <start>,<end>:file
# and 
git log -s -L :<funcname>:file

都应该使用 Git >= 2.22.0 来抑制补丁输出。这是在提交 9f607cd09c (line-log: suppress diff output with "-s", 2019-03-07) 中添加的。

另外,你提到了

git log --oneline -L 10,11:example.txt

不起作用。 --oneline 应该只适用于提交标头,而不是 diff 输出(--oneline -p 将在一行上显示提交信息,然后是 diff 输出)。

我检查了 Git 2.13.3(2017 年 7 月 12 日发布,所以大约在您发布问题的时候)并且 git log --oneline -L 10,11:example.txt 确实有效(但它确实输出了完整的补丁)。

【讨论】:

    【解决方案2】:

    一些详细的解决方案是使用普通的 git log -L 命令输出感兴趣行的日志,然后将输出通过管道传输到 grep 或 sed 以仅打印您感兴趣的提交消息的部分。 尝试您喜欢的任何版本。很想听听是否有人有一个不那么冗长的解决方案!

    grep:

    git log -L 10,11:example.txt | grep 'commit \w' -A 4
    

    grep 命令匹配每个日志条目的第一行,并使用 -A 标志打​​印接下来的 4 行

    sed:

    git log -L 10,11:example.txt | sed -n '/commit/{p;n;n;n;n;p}' 
    

    当它找到匹配时,通过 p 命令打印该行,通过 n 命令跳过下一行,然后使用 p 打印下一行。前导 -n 选项阻止所有其他打印。感谢this answer

    【讨论】:

    • 令人惊讶的是,使用--format 选项到git log 仍然会发出差异,并且我看不到关闭差异输出的选项,以便获得确切的输出是需要的。如果没有一些惊人的技巧,通过输出 grep 并不是 100% 可靠:如果 diff 输出本身包含您试图在管道到 egrep 中匹配的内容怎么办?惊人的诡计示例:uuid=$(uuidgen); git log -2 --pretty=tformat:"$uuid %h" -L 16,16:some_file.org | sed -n "s%^$uuid %%gp"
    猜你喜欢
    • 2017-05-16
    • 2015-10-20
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2015-05-21
    • 2011-09-30
    • 2019-12-11
    相关资源
    最近更新 更多