是否有可能在{/ 1}}报告之前查看某个特定行的编辑者,就像给定行的提交历史记录一样?
例如,我运行以下(在精湛的git blame
项目上):
uncrustify
如何在提交$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
之前找出谁编辑了行?谁在 提交之前编辑了它?
答案 0 :(得分:335)
git blame -L10,+1 fe25b6d^ -- src/options.cpp
您可以指定git blame的修订版,以便从({而不是默认的HEAD
)开始回顾; fe25b6d^
是fe25b6d
的父级。
答案 1 :(得分:156)
您可以使用 git log -L 查看一系列行的演变。
例如:
git log -L 15,23:filename.txt
表示“跟踪名为filename.txt的文件中第15行到第23行的演变”。
答案 2 :(得分:23)
Amber的回答是正确的,但我发现它不清楚;语法是:
git blame {sha1} -- {path/to/file}
注意:--
用于将tree-ish sha1与相对文件路径分开。 1
例如:
git blame master -- index.html
完全赞同Amber了解所有事情! :)
答案 3 :(得分:21)
您可能需要查看:
git gui blame <filename>
为您提供一个很好的图形显示,例如“git blame”,但每行都有可点击的链接,以便进入之前的提交。将鼠标悬停在链接上以获取包含提交详细信息的弹出窗口。不是我的学分......在这里找到了:
http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
git gui
是git的图形化Tcl / Tc接口。没有任何其他参数,它启动一个非常简单但有用的图形应用程序,用于提交文件,帅哥甚至单行和其他类似的命令,如修改,恢复,推...它是git股票套件的一部分。在Windows上,它包含在安装程序中。关于debian - 我不知道其他* nix系统 - 它必须单独安装:
apt-get install git-gui
来自文档:
https://git-scm.com/docs/git-gui
<强>描述强>
基于Tcl / Tk的Git图形用户界面。 git gui专注于 允许用户通过创建新的来更改其存储库 提交,修改现有的,创建分支,执行本地 合并,并提取/推送到远程存储库。
与gitk不同,git gui专注于提交生成和单个文件 注释,不显示项目历史记录。然而它确实供应 用于从git gui中启动gitk会话的菜单操作。
众所周知,git gui适用于所有流行的UNIX系统,Mac OS X和 Windows(在Cygwin和MSYS下)。尽可能的OS 遵循特定的用户界面指南,制作git gui a 用户的相当原生的界面。<强>命令强>
<强>怪强>
在给定版本(或工作目录,如果未指定)上的指定文件上启动blame查看器。
<强>浏览器强>
启动树形浏览器,显示指定提交中的所有文件。通过浏览器选择的文件在责备查看器中打开。
<强> citool 强>
启动git gui并安排在退出并返回shell之前进行一次提交。界面仅限于此 提交操作,稍微减少应用程序的启动时间和 简化了菜单栏。
版本强>
显示当前正在运行的git gui版本。
答案 4 :(得分:17)
在前一个答案的基础上,这个bash one-liner应该会给你你想要的东西。它通过最后5个版本显示特定文件的特定行的git blame历史记录:
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
在此命令的输出中,您可能会看到对于特定提交,行更改的内容或显示的行号甚至可能会更改。
这通常表示在该特定提交之后第一次添加了该行。它还可以表明该行已从文件的另一部分移出。
答案 5 :(得分:12)
还有recursive-blame
。它可以与
npm install -g recursive-blame
答案 6 :(得分:7)
针对此问题的一个非常独特的解决方案是使用git log:
git log -p -M --follow --stat - path / to / your / file
正如Andre here
所解释的那样答案 7 :(得分:5)
If you are using JetBrains Idea IDE (and derivatives) you can select several lines, right click for the context menu, then Git -> Show history for selection. You will see list of commits which were affecting the selected lines:
答案 8 :(得分:1)
根据Will Shepard的回答,他的输出将包含没有更改的提交重复行,因此您可以按以下方式过滤这些行(使用此answer)
{{1}}
请注意,我删除了REVS参数,然后返回到root提交。这是由于Max Nanasy的观察结果。
答案 9 :(得分:1)
以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'
答案 10 :(得分:0)
我使用这个小小的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 blame的正则表达式搜索,因为行号通常会随着时间的推移而“改变”。
答案 11 :(得分:0)
在stangls的answer上构建,我把这个脚本放在我的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
}
答案 12 :(得分:0)
从Git 2.23开始,您可以使用git blame --ignore-rev
对于问题中给出的示例,这将是:
git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d
(但这是一个棘手的问题,因为fe25b6d是文件的第一个修订版!)
答案 13 :(得分:0)
我编写了ublame
python工具,该工具返回了影响给定搜索词的文件提交的天真历史记录,您会在þroject page中找到更多信息。 / p>