是否有可能看到谁在git blame报告的提交之前编辑了特定的行,就像一个给定行的提交历史?
例如,我运行以下(在优秀的uncrustify项目上):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
我如何才能找到谁在提交fe25b6d之前编辑了这一行?在提交之前是谁编辑的?
是否有可能看到谁在git blame报告的提交之前编辑了特定的行,就像一个给定行的提交历史?
例如,我运行以下(在优秀的uncrustify项目上):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
我如何才能找到谁在提交fe25b6d之前编辑了这一行?在提交之前是谁编辑的?
当前回答
安布尔的回答是正确的,但我觉得不清楚;语法为:
git blame {commit_id} -- {path/to/file}
注意:——用于将树状sha1与相对文件路径分开。1
例如:
git blame master -- index.html
这一切都要归功于安布尔!:)
其他回答
git blame -L 10,+1 fe25b6d^ -- src/options.cpp
你可以为git blame指定一个修订,从(而不是默认的HEAD)开始回溯;Fe25b6d ^是Fe25b6d的父元素。
编辑:作为Git 2.23的新版本,我们在Git blame中添加了——ignore-rev选项:
git blame --ignore-rev fe25b6d
虽然这不能回答OP给出提交堆栈的问题(根据其他答案,您将使用git log),但这是该解决方案的一种更好的方式,因为您不会对其他行产生误解。
在前面的回答的基础上,这个bash一行代码应该可以提供您所要查找的内容。它显示了特定文件的特定行,通过最近5个修订的git责备历史:
LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done
在这个命令的输出中,对于特定的提交,您可能会看到行内容发生变化,或者显示的行号甚至可能发生变化。
这通常表明这一行是在特定的提交之后第一次添加的。它还可以指示该行从文件的另一部分移动。
基于Will Shepard的回答,他的输出将包含没有更改的提交的重复行,因此您可以按照以下方式过滤这些行(使用这个答案)
LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'
注意,我删除了REVS参数,这将返回到根提交。这是由于Max Nanasy上面的观察。
如果你正在使用JetBrains Idea IDE(和衍生品),你可以选择几行,右键单击上下文菜单,然后Git ->显示历史选择。你将看到影响选定行的提交列表:
我使用这个小bash脚本查看一个指责历史。
第一个参数:要查看的文件
后续参数:传递给git blame
#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
while read hash; do
echo "--- $hash"
git blame $@ $hash -- "$f" | sed 's/^/ /'
done
}
你可以提供像-L 70,+10这样的责备参数,但最好使用git责备的正则表达式搜索,因为行号通常会随着时间的推移而“改变”。