是否有可能看到谁在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 -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 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责备的正则表达式搜索,因为行号通常会随着时间的推移而“改变”。


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

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

注意:——用于将树状sha1与相对文件路径分开。1

例如:

git blame master -- index.html

这一切都要归功于安布尔!:)


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

还有递归指责。它可以安装

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

DESCRIPTION A Tcl/Tk based graphical user interface to Git. git gui focuses on allowing users to make changes to their repository by making new commits, amending existing ones, creating branches, performing local merges, and fetching/pushing to remote repositories. Unlike gitk, git gui focuses on commit generation and single file annotation and does not show project history. It does however supply menu actions to start a gitk session from within git gui. git gui is known to work on all popular UNIX systems, Mac OS X, and Windows (under both Cygwin and MSYS). To the extent possible OS specific user interface guidelines are followed, making git gui a fairly native interface for users. COMMANDS blame Start a blame viewer on the specified file on the given version (or working directory if not specified). browser Start a tree browser showing all files in the specified commit. Files selected through the browser are opened in the blame viewer. citool Start git gui and arrange to make exactly one commit before exiting and returning to the shell. The interface is limited to only commit actions, slightly reducing the application’s startup time and simplifying the menubar. version Display the currently running version of git gui.


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


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

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

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

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


我写了一个ublame python工具,它可以返回影响给定搜索词的文件提交的简单历史,你可以在þroject页面上找到更多信息。