441

是否可以在报告的提交之前查看谁编辑了特定行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编辑了该行?谁在那次提交之前编辑了它?

4

14 回答 14

443
git blame -L 10,+1 fe25b6d^ -- src/options.cpp

您可以为 git blame 指定一个修订版,以从(而不是默认的 )开始回顾HEADfe25b6d^是 的父级fe25b6d


编辑:Git 2.23的新手,我们--ignore-rev添加了以下选项git blame

git blame --ignore-rev fe25b6d

虽然这不能回答 OP 提供提交堆栈的问题(git log根据其他答案,您将使用它),但这是该解决方案的更好方法,因为您不会误判其他行。

于 2011-02-23T22:55:18.223 回答
226

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

例如 :

git log -L 15,23:filename.txt

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

于 2015-09-04T11:12:01.487 回答
38

Amber 的回答是正确的,但我发现不清楚;语法是:

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

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

例如:

git blame master -- index.html

完全归功于Amber知道所有的事情!:)

于 2014-05-19T23:31:20.680 回答
29

您可能想查看:

git gui blame <filename>

为您提供一个很好的图形显示更改,例如“git blame”,但每行都有可点击的链接,以便进入更早的提交。将鼠标悬停在链接上以获取包含提交详细信息的弹出窗口。不是我的学分......在这里找到它:

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

git gui是 git 的图形化 Tcl/Tc 界面。没有任何其他参数,它会启动一个非常简单但有用的图形应用程序,用于提交文件、大块甚至单行以及其他类似的命令,如修改、恢复、推送......它是 git stock 套件的一部分。在 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 下)。尽可能遵循操作系统特定的用户界面指南,使 git gui 成为用户相当原生的界面。

命令

责备

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

浏览器

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

柠檬醇

启动 git gui 并安排在退出并返回 shell 之前进行一次提交。该界面仅限于提交操作,略微减少了应用程序的启动时间并简化了菜单栏。

版本

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

于 2016-09-20T10:59:47.263 回答
18

在上一个答案的基础上,这个 bash 单线应该给你你正在寻找的东西。它显示特定文件的特定行的 git blame 历史记录,通过最后 5 个修订:

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

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

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

于 2012-09-27T13:25:04.787 回答
14

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

git log -p -M --follow --stat -- path/to/your/file
于 2016-05-29T07:21:19.020 回答
12

还有recursive-blame。它可以安装

npm install -g recursive-blame
于 2015-09-04T10:46:15.610 回答
11

如果您使用的是 JetBrains Idea IDE(和衍生产品),您可以选择多行,右键单击上下文菜单,然后选择 Git -> Show history for selection。您将看到影响所选行的提交列表:

在此处输入图像描述

于 2017-12-18T07:17:52.640 回答
4

从 Git 2.23 开始,您可以使用git blame --ignore-rev

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

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

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

于 2019-09-06T22:56:36.383 回答
1

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

于 2015-09-20T04:08:39.163 回答
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'

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

于 2016-05-29T21:40:20.777 回答
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 的正则表达式搜索,因为行号通常会随着时间的推移而“改变”。

于 2014-02-16T16:28:39.647 回答
0

建立在stangls答案上,我把这个脚本作为 git-bh 放在我的 PATH 中(即使在 Windows 上):

这使我可以查找涉及单词的所有提交:

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
}
于 2014-07-11T12:52:46.623 回答
0

我编写了ublamepython 工具,它返回影响给定搜索词的文件提交的原始历史,您可以在þroject 页面上找到更多信息。

于 2020-11-11T10:34:51.920 回答