有没有办法让git给你一个提交日志,只提交触及文件中的特定行?

就像git blame,但git blame会显示触及特定行的LAST commit。

我希望得到一个类似的日志,不是文件中任何地方的提交列表,而是触及特定行的提交。


当前回答

简单易行的git责备命令 起止线(735,750)

L735,750(语法)

git责备-L735,750 patient.php(文件路径和名称)

其他回答

你可以通过使用picko -axe来获得一组提交。

git log -S'the line from your file' -- path/to/your/file.txt

这将为您提供影响该文件中该文本的所有提交。如果文件在某个时候被重命名,您可以添加——follow-parent。

如果你想在每次编辑时检查提交,你可以将结果管道到git show:

git log ... | xargs -n 1 git show

如果该行的位置(行号)在文件的历史记录中保持不变,这将在每次提交时显示该行的内容:

git log --follow --pretty=format:"%h" -- 'path/to/file' | while read -r hash; do echo $hash && git show $hash:'path/to/file' | head -n 544 | tail -n1; done

将“544”修改为行号,将“/to/file”修改为文件路径。

我不相信有什么内置的。这很棘手,因为很少有一行更改多次,而文件的其余部分也没有发生重大更改,所以最终往往会导致行号更改很多。

如果你足够幸运,这一行总是有一些识别特征,例如赋值给一个名称从未改变的变量,你可以使用regex选项git blame -L。例如:

git blame -L '/variable_name *= */',+1

但这只会找到正则表达式的第一个匹配项,所以如果你没有一个匹配行的好方法,它就没有太大的帮助。

我猜你可以做点什么。我现在没有时间写代码,但是…沿着这条线。运行git blame -n -L $n,$n $file。第一个字段是前一次提交所触及的,第二个字段是该提交中的行号,因为它可能会改变。获取这些,然后运行git blame -n $n,$n $commit^ $file,也就是说,从上次修改文件之前的提交开始。

(请注意,如果更改行的最后一次提交是合并提交,这将失败。如果作为合并冲突解决的一部分,行被更改,那么这种情况可能发生的主要方式。)

编辑:我今天偶然看到了这篇2011年3月的邮件列表,其中提到tig和git gui有一个功能可以帮助你做到这一点。对于git本身来说,这个特性似乎已经考虑过了,但还没有完成。

一个非常简单的方法是使用vim-fugitive。只需在vim中打开文件,选择您感兴趣的使用V的行,然后输入

:Glog

现在您可以使用:cnext和:cprev来查看该行被修改的文件的所有修订。在任何时候,输入:Gblame以查看sha、作者和日期信息。

您可以混合使用git blame和git log命令来检索git blame命令中每次提交的摘要并附加它们。类似于以下bash + awk脚本。它将提交摘要作为代码注释内联添加。

git blame FILE_NAME | awk -F" " \
'{
   commit = substr($0, 0, 8);
   if (!a[commit]) {
     query = "git log --oneline -n 1 " commit " --";
     (query | getline a[commit]);
   }
   print $0 "  // " substr(a[commit], 9);
 }'

一句话:

git blame FILE_NAME | awk -F" " '{ commit = substr($0, 0, 8); if (!a[commit]) { query = "git log --oneline -n 1 " commit " --"; (query | getline a[commit]); } print $0 "  // " substr(a[commit], 9); }'