我怎么能查看之前的提交与git指责?

是否可以看到谁编辑了由git blame报告的特定行之前,就像一个给定行的提交历史?

例如,我运行以下(在优秀的uncrustify项目上):

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

我怎样才能知道谁编辑了这行之前 commit fe25b6d?谁在提交之前编辑了它?

124366 次浏览
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

在这个命令的输出中,对于特定的提交,您可能会看到行内容发生变化,或者显示的行号甚至可能发生变化。

这通常表明这一行是在特定的提交之后第一次添加的。它还可以指示该行从文件的另一部分移动。

我使用这个小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的责备参数,但最好使用git责备的正则表达式搜索,因为行号通常会随着时间“改变”。

安布尔的回答是正确的,但我觉得不清楚;语法为:

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

注意:--用于将树状sha1与相对文件路径分开。<一口> < a href = " https://stackoverflow.com/questions/5098256/git-blame-prior-commits comment17431791_5098314”> 1 < / > < /一口>

例如:

git blame master -- index.html

完全归功于琥珀色的知道所有的事情!:)

基于斯坦格尔回答,我把这个脚本放在我的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
}

还有recursive-blame。它可以安装

npm install -g recursive-blame

你可以使用git log -L来查看一行范围的演变。

例如:

git log -L 15,23:filename.txt

表示“跟踪文件名.txt文件中第15行到第23行的演变”。

基于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上面的观察。

这个问题的一个非常独特的解决方案是使用git log,正如Andre 在这里所解释的:

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

基于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'

裁判:在git日志中很好地显示文件重命名历史

你可能想看看:

git gui blame <filename>

给你一个漂亮的图形显示的变化,如“git责备”,但每行可点击的链接,移动到更早的提交。将鼠标悬停在链接上,就会弹出一个包含提交细节的窗口。不是我的学分……在这里找到它:

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侧重于 允许用户通过创建new对其存储库进行更改 提交,修改现有的,创建分支,执行本地 合并,并获取/推送到远程存储库 与gitk不同,git gui专注于提交生成和单个文件 注释,不显示项目历史。但它确实提供了 从git gui中启动gitk会话的菜单操作

git gui已知可以在所有流行的UNIX系统、Mac OS X和 Windows (Cygwin和MSYS下)。尽可能的操作系统 遵循特定的用户界面准则,使git GUI成为一个

命令

在给定版本的指定文件(或工作目录,如果未指定)上启动责备查看器。

浏览器

启动一个树状浏览器,显示指定提交中的所有文件。通过浏览器选择的文件将在责备查看器中打开。

citool

启动git gui,并安排在退出并返回shell之前只提交一次。接口被限制为only 提交操作,略微减少应用程序的启动时间和

版本

显示当前运行的git gui版本。

如果你正在使用JetBrains Idea IDE(和衍生品),你可以选择几行,右键单击上下文菜单,然后Git ->显示历史选择。你将看到影响选定行的提交列表:

enter image description here

从Git 2.23开始,你可以使用get blame -ignore-rev

对于问题中给出的例子,这将是:

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

(然而,这是一个棘手的问题,因为fe25b6d是该文件的第一个修订!)

我写了ublame python工具,它返回影响给定搜索词的文件提交的天真的历史,你会发现更多关于þ工程”页面的信息。