Git责备 - 事先提交?

时间:2011-02-23 22:50:49

标签: git commit blame

是否有可能在{/ 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" 之前找出谁编辑了行?谁在 提交之前编辑了它?

14 个答案:

答案 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:

enter image description here

答案 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'

参考:nicely display file rename history in git log

答案 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)

stanglsanswer上构建,我把这个脚本放在我的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>