是否有可能看到谁在提交报告之前编辑了特定行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
,例如给定行的提交历史?
例如,我运行以下命令(在一流的uncrustify
项目上):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
如何确认提交之前谁编辑了该行fe25b6d
?又是谁之前编辑它是承诺?
Answers:
git blame -L 10,+1 fe25b6d^ -- src/options.cpp
您可以为git blame指定一个修订版本,以从(而不是默认值HEAD
)开始查找;fe25b6d^
是的父母fe25b6d
。
--
通常用作命令行参数中的分隔符-在Git的情况下,通常用于从文件名列表中分离诸如提交哈希之类的东西。
您可以使用git log -L查看一系列行的演变。
例如 :
git log -L 15,23:filename.txt
表示“跟踪名为filename.txt的文件中第15至23行的演变”。
琥珀的答案是正确的,但我不清楚。语法为:
git blame {commit_id} -- {path/to/file}
注意:--
用来将树状sha1与相对文件路径分开。1个
例如:
git blame master -- index.html
完全学分制,以琥珀色为了解所有的事情!:)
您可能要签出:
git gui blame <filename>
为您提供漂亮的图形化显示,例如“ git blame”,但每行具有可单击的链接,以移至较早的提交。将鼠标悬停在链接上可以看到带有提交详细信息的弹出窗口。不是我的积分...在这里找到它:
http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
git gui
是git的图形Tcl / Tc界面。没有任何其他参数,它启动了一个非常简单但有用的图形应用程序,用于提交文件,大块甚至单行以及其他类似的命令,例如amend,revert,push ...这是git stock套件的一部分。在Windows上,它包含在安装程序中。在debian上-我对其他* nix系统一无所知-它必须单独安装:
apt-get install git-gui
从文档:
https://git-scm.com/docs/git-gui
描述
Git的基于Tcl / Tk的图形用户界面。git gui专注于允许用户通过提交新提交,修改现有提交,创建分支,执行本地合并以及获取/推送到远程存储库来更改其存储库。
与gitk不同,git gui专注于提交生成和单个文件注释,并且不显示项目历史记录。但是,它确实提供了菜单操作以从git gui中启动gitk会话。
已知git gui可在所有流行的UNIX系统,Mac OS X和Windows(在Cygwin和MSYS下)上工作。在一定程度上遵循了特定于OS的用户界面指南,使git gui成为用户的本机界面。
指令
怪
在给定版本(或工作目录,如果未指定)上的指定文件上启动blame查看器。
浏览器
启动一个树形浏览器,显示指定提交中的所有文件。通过浏览器选择的文件在非常规查看器中打开。
citool
启动git gui并安排在退出并返回shell之前进行一次完全提交。该界面仅限于提交操作,从而略微减少了应用程序的启动时间并简化了菜单栏。
版
显示当前正在运行的git gui版本。
this
:但是我如何查看该行的先前版本以及何时添加?
在以前的答案的基础上,这款bash单线衬垫应为您提供所需的东西。它显示最近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
在此命令的输出中,对于特定的提交,您可能会看到行的内容更改,或者显示的行号甚至可能更改。
这通常表明该行是在该特定提交之后第一次添加的。这也可能表明该行已从文件的另一部分移出。
也有recursive-blame
。可以安装
npm install -g recursive-blame
git config --global alias.changes 'log -p -M --follow --stat --'
然后我可以简单地键入git changes 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 2.23开始,您可以使用git blame --ignore-rev
对于问题中给出的示例,这将是:
git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d
(但是这是一个棘手的问题,因为fe25b6d是文件的第一个修订版!)
基于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
}
-w
选项。还有-M
用于移动/复制的代码