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

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


如果您正在使用Git GUI(在Windows上):

在“存储库”菜单下,您可以使用“可视化大师的历史记录”。

突出显示顶部窗格中的提交和右下角的文件,您将在左下角看到该提交的差异。


这使得Git可以为每个日志条目生成补丁:

git log -p -- filename

查看git帮助日志了解更多选项-它实际上可以做很多好事。:)


要获取特定提交的差异,请使用

git show HEAD

或通过标识符指定任何其他修订。


要直观浏览更改,请执行以下操作:

gitk

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

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


对于图形视图,请使用gitk:

gitk [filename]

要跨文件重命名跟随文件,请执行以下操作:

gitk --follow [filename]

要显示文件每行的修订版本和作者上次修改的内容,请执行以下操作:

git blame filename

或者如果您想使用功能强大的责备GUI:

git gui blame filename

Or:

gitx--<path/to/filename>

如果你使用的是gitx


git log --follow -p -- path-to-file

这将显示文件的整个历史记录(包括重命名后的历史记录以及每次更改的差异)。

换句话说,如果名为bar的文件曾经被命名为foo,那么git-log-p bar(不带--follow选项)将只显示文件重命名之前的历史记录——当它被称为foo时,它不会显示文件的历史记录。使用git-log--follow-p bar将显示文件的整个历史记录,包括文件名为foo时对其所做的任何更改。-p选项确保每个更改都包含差异。


我要找的答案不在这里。这是为了查看我准备提交的文件中的更改。即。,

git diff --cached

tig是一种基于终端的查看器,具有类似于基于GUI的gitk的颜色支持。

快速安装:

APT:APT-get-install tigHomebrew(OS X):$brew安装tig

使用它可以查看单个文件的历史记录:tig[filename]

或通过:tig浏览详细的存储库历史记录


如果要查看文件的整个历史记录,包括所有其他分支,请使用:

gitk --all <filename>

我写git回放就是为了这个目的

pip install git-playback
git playback [filename]

这样既可以在命令行中显示结果(如gitlog-p),也可以使用箭头键(如gitk)逐步完成每次提交。


使用优秀的Git扩展,您可以转到历史中文件仍然存在的位置(如果文件已被删除,否则只需转到HEAD),切换到文件树选项卡,右键单击文件并选择文件历史。

默认情况下,它通过重命名跟随文件,Blame选项卡允许查看给定版本的名称。

它有一些小缺点,比如显示致命错误:单击删除修订版时,“视图”选项卡中没有有效的对象名称,但我可以接受。:-)


阅读并播放一点后,总结其他答案:

通常的命令行命令是

git log --follow --all -p dir/file.c

但是,您也可以使用gitk(GUI)或tig(文本UI)来提供更多人类可读的方式来查看它。

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

在Debian/Uubuntu下,这些可爱工具的安装命令如下所示:

sudo apt-get install gitk tig

我目前正在使用:

alias gdf='gitk --follow --all -p'

这样我就可以键入gdf-dir来获取子目录dir中所有内容的集中历史。


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


gitdiff-U<filename>为您提供统一的diff。

它应该是红色和绿色的。如果不是,请先运行:git-config-color.ui-auto。


将此别名添加到.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输出完全相同。享受


Sourcetree用户

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

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


如果您使用TortoiseGit,您应该能够右键单击该文件并执行TortoiseGit-->显示日志。在弹出的窗口中,确保:

未选中“显示整个项目”选项。选中“所有分支”选项。


您也可以尝试这个方法,它列出了更改文件特定部分的提交(在Git1.8.4中实现)。

返回的结果将是修改此特定部分的提交列表。命令:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

其中upperLimit是文件的起始行号,lowerLimit是结束行号。

更多详情请访问http://techpurohit.in/list-some-useful-git-commands.


最近我发现了tig,发现它非常有用。有些情况下,我希望它能做到A或B,但大多数时候它都很整洁。

对于您的情况,tig<filename>可能是您需要的。

https://jonas.github.io/tig/


SmartGit:

在菜单中启用以显示未更改的文件:查看/显示未更改文件右键单击文件并选择“日志”或按“Ctrl-L”


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

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


我大概是想知道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的直接响应。


在Sourcetree UI中,您可以通过选择右键单击上下文菜单中的“Log Selected”选项来查找文件的历史记录:

它将显示所有提交的历史。


要获取特定文件的所有提交,请使用以下命令:

git rev list HEAD--单行文件名


例如

git rev list HEAD--单行index.html

输出

7a2bb2f update_index_with_alias
6c03e56 update_changes
e867142 Revert "add_paragraph"

如果要查看对文件所做的更改

git-log-p文件名

查看gif图像


如何在meld中以图形方式手动查看文件的更改历史

如果您只想查看哪个提交更改了文件,那么可以对它们执行gitdifftool,以图形方式查看meld的更改(如我在这里所解释的),请改为执行以下操作:

git log --follow --oneline -- path/to/file.c

样本运行和输出:

eRCaGuy_hello_world$ git log --follow --oneline -- c/alsa_aplay__play_tone_sound_WIP.c
04b67fb (HEAD -> master) Update c/alsa_aplay__play_tone_sound_WIP.c
301122a wip: alsa_aplay__play_tone_sound.c: finish initial version of program
d4e8092 wip: add c/alsa_aplay__play_tone_sound.c

现在我可以像这样以图形方式查看meld中的最后更改(从上面的输出中提取提交散列)。

请注意,我有意省略了文件名,以便它可以在文件重命名后自动为我正确跟踪文件,我知道这些提交可能只编辑了这个文件:

# just the last change
git difftool 04b67fb~..04b67fb

# and the one before that
git difftool 301122a~..301122a

# ...and before that
git difftool d4e8092~..d4e8092

如果需要指定文件名,只需使用:

git difftool 04b67fb~..04b67fb -- path/to/file.c