如果一行代码在两个版本之间反复修改多次,git blame 命令似乎只会显示该行最新的提交记录。
是否可能让其显示该行的所有提交记录?
git blame
本身无法做到这一点(但请参见下面的解决方法)。
但是 git gui
有一个“blame 模式”,允许您深入了解提交。
安装后,使用git gui blame <filename>
命令调用该模式。
我不清楚如何同时显示该行的所有提交记录,但您可以使用git blame SHA~ -- 文件名
来逐步查看每次对该行进行更改。随着每次blame的迭代,只需插入修改该行的下一个最“新”的SHA。
例如:第一次运行git blame foo.php
时,您会看到该行已由f8e2e89a
修改,然后退出并运行git blame f8e2e89a~ -- foo.php
,git将向您展示在f8e2e89a
之前是谁修改了该行。如有必要,请重复以上步骤。
使用git blame
无法实现您想要的功能,但是您可以通过单词差异算法或其他自定义差异工具来接近。特别地,您可以在日志输出中显示逐行单词差异,如下所示:
# Show deletions delimited with [- -], and additions with {+ +}.
git log --patch --word-diff=plain
git blame
的目的是显示哪个提交最近修改了特定文件中的哪些行。它没有显示同一行的多个版本的选项。
git blame HEAD~n -- filename
的命令来模拟此操作,其中 n
从0开始递增。虽然这不是一种交互式的方式,但每次增加数字,你都会查看更早期的历史记录。 - cdhowie根据已经提供的答案,我创建了一个名为git-rblame
的脚本,并将其放在我的PATH中,内容如下:
#!/bin/bash
revision="HEAD"
while [ -n "${revision}" ]
do
result=$(git blame "${revision}" "$@")
revision="${result%% *}"
if [[ "${revision}" != [a-z0-9]*[a-z0-9] ]]
then
revision=""
else
echo "${result}"
revision="${revision}~"
fi
done
然后我可以调用git rblame -L xxx,yyy myfilename
,并获得相应内容的文件的完整历史记录。考虑到行号可能会发生变化,有意义的正则表达式似乎更有效。