多次修改的代码行如何使用git blame查看修改记录?

16

如果一行代码在两个版本之间反复修改多次,git blame 命令似乎只会显示该行最新的提交记录。

是否可能让其显示该行的所有提交记录?


请参考https://dev59.com/9Goy5IYBdhLWcg3wnPSJ。这是可行的,而且相当容易。 - Moshe Weitzman
5个回答

14

git blame 本身无法做到这一点(但请参见下面的解决方法)。

但是 git gui 有一个“blame 模式”,允许您深入了解提交。

安装后,使用git gui blame <filename> 命令调用该模式。


14

我不清楚如何同时显示该行的所有提交记录,但您可以使用git blame SHA~ -- 文件名来逐步查看每次对该行进行更改。随着每次blame的迭代,只需插入修改该行的下一个最“新”的SHA。

例如:第一次运行git blame foo.php时,您会看到该行已由f8e2e89a修改,然后退出并运行git blame f8e2e89a~ -- foo.php,git将向您展示在f8e2e89a之前是谁修改了该行。如有必要,请重复以上步骤。


2

使用git blame无法实现您想要的功能,但是您可以通过单词差异算法或其他自定义差异工具来接近。特别地,您可以在日志输出中显示逐行单词差异,如下所示:

# Show deletions delimited with [- -], and additions with {+ +}.
git log --patch --word-diff=plain

参见

从Git仓库中提取作者信息


1

git blame 的目的是显示哪个提交最近修改了特定文件中的哪些行。它没有显示同一行的多个版本的选项。


谢谢。不幸的是,我正在寻找类似于Perforce“责备”按钮的东西,它可以显示您在历史记录中的所有提交。 - teddy teddy
1
你可以通过执行 git blame HEAD~n -- filename 的命令来模拟此操作,其中 n 从0开始递增。虽然这不是一种交互式的方式,但每次增加数字,你都会查看更早期的历史记录。 - cdhowie
呵呵呵。在我的 SVN 时代,我曾经做过类似的事情:perl -e 'for $v ( 0 .. $current_version ) { system(qq(svn diff -r).($v-1).qq( -r$v mysource.java ) } ' - teddy teddy

0

根据已经提供的答案,我创建了一个名为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,并获得相应内容的文件的完整历史记录。考虑到行号可能会发生变化,有意义的正则表达式似乎更有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接