Git怪 – 之前的承诺?

我喜欢git blame命令,这对于追踪那些不需要编写代码的人来说非常有用。 🙂

然而, git blame所提交的提交之前 ,是否可以看到谁编辑了特定的行,例如提交给定行的提交历史logging?

例如,我运行以下(在超级uncrustify项目):

 $ git blame -L10,+1 src/options.cpp ^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h" 

如何提交fe25b6d 之前找出谁编辑了该行? 谁是在提交之前编辑它的? 我相信这是可能的,但我的git-fu很弱。

 git blame -L10,+1 fe25b6d^ -- src/options.cpp 

你可以指定一个修改混帐责备回头看(而不是默认的HEAD ); fe25b6d^fe25b6d^的父fe25b6d

您可以使用git log -L来查看一系列行的演变。

例如 :

 git log -L 15,23:filename.txt 

意思是“跟踪名为filename.txt的文件中15到23行的演变”。

build立在以前的答案,这个bash单线程应该给你你想要的。 它通过最近的5个修订版显示了特定文件的特定行的git blame历史logging:

 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 

在此命令的输出中,对于特定的提交,您可能会看到换行的内容,或显示的行号甚至可能会改变。

这通常表明该行是在特定的提交之后首次添加的。 它也可能表示该行已从文件的另一部分移出。

琥珀的答案是正确的,但我发现它不清楚; 语法是:

 git blame {sha1} -- {path/to/file} 

注意: --用于将tree-ish sha1与相对文件path分开。 1

例如:

 git blame master -- index.html 

充分相信琥珀知道所有的事情! 🙂

还有recursive-blame 。 它可以安装

 npm install -g recursive-blame 

这个问题的一个非常独特的解决scheme是使用git log:

git log -p -M – follow –stat – path / to / your / file

正如Andre 在这里解释的那样

你可能想看看:

 git gui blame <filename> 

给你一个不错的graphics显示,像“git blame”这样的变化,但每行都有可点击的链接,以便移动到更早的提交中。 将鼠标hover在链接上以获取提交详细信息的popup窗口。 不是我的信用…在这里find它:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

build立在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的观察。

build立在DavidN的答案,我想跟随改名的文件:

 LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D' 

ref: 在git log中很好地显示文件重命名历史logging

我用这个小bash脚本来看看一个怪的历史。

第一个参数:要查看的文件

后续参数:通过git责备

 #!/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这样的blame参数但是最好用正则expression式来searchgit blame,因为行号通常会随着时间的推移而“变化”。

build立在stangls的答案 ,我把这个脚本在我的path(甚至在Windows)作为git-bh:

这允许我查找所涉及的所有提交:

 git bh path/to/myfile myWord 

脚本:

 #!/bin/bash f=$1 shift csha="" { git log --pretty=format:%H -- "$f"; echo; } | { while read hash; do res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/ /') sha=${res%% (*} if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then echo "--- ${hash}" echo "${res}" csha="${sha}" fi done } 
Interesting Posts