如何查看单个文件的历史记录以及更改内容的完整详细信息?

git-log--[filename]显示文件的提交历史,但如何查看更改的文件内容?


当前回答

我大概是想知道OP开始时的位置,寻找一些简单的东西,让我可以使用gitdifftool和vimdiff从特定提交开始查看repo中文件的更改。我对我找到的答案不太满意,所以我把这个gitincremental reporter(gitincrement reporter)脚本放在一起,它对我很有用:

#!/usr/bin/env bash

STARTWITH="${1:-}"
shift 1

DFILES=( "$@" )

RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2

        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}

OLDVERS=""
RUNDIFF=""

for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

调用时不带任何参数,这将从回购历史的开始处开始,否则它将从您提供的任何缩写提交哈希开始,并继续到现在-您可以随时使用ctrl-C退出。第一个参数之后的任何参数都将限制差异报告仅包括这些参数中列出的文件(我认为这是OP想要的,我建议所有项目都使用这些文件,但小项目除外)。如果您正在检查对特定文件的更改,并希望从头开始,则需要为arg1提供空字符串。如果你不是vim用户,你可以用你喜欢的diff工具替换vimdiff。

行为是在发现相关更改时输出提交注释,并开始为每个更改的文件提供vimdiff运行(这是gitdifftool行为,但它在这里起作用)。

这种方法可能很幼稚,但在这里和一篇相关文章中查看了许多解决方案,其中许多涉及在我没有管理员权限的系统上安装新工具,界面有自己的学习曲线。上面的脚本做了我想做的事情,但没有处理这些。当我需要更复杂的东西时,我会研究这里的许多优秀建议,但我认为这是对OP的直接响应。

其他回答

将此别名添加到.gitconfig中:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

使用如下命令:

> git lg
> git lg -- filename

输出看起来几乎与gitk输出完全相同。享受

您可以将Visual Studio代码与GitLens一起使用。这是一个非常强大的工具。

安装好GitLens后,转到GitLens选项卡,选择FILE HISTORY,即可浏览。

在本例中,gitwhatchanged-p文件名也等效于gitlog-p文件名。

您还可以看到文件中的特定代码行何时更改为git责备文件名。这将为文件中的每一行打印一个简短的提交id、作者、时间戳和完整的代码行。当你发现了一个bug并且你想知道它是什么时候引入的(或者是谁的错),这是非常有用的。

如果您将Eclipse与Git插件一起使用,那么它具有与历史的极好的比较视图。右键单击文件并选择“比较”→ “历史”。

Sourcetree用户

如果您使用Sourcetree可视化存储库(它是免费的,非常好),您可以右键单击文件并选择Log Selected

显示(下图)比gitk和列出的大多数其他选项友好得多。不幸的是(此时)没有从命令行启动此视图的简单方法-Sourcetree的CLI当前只打开存储库。