使用Git版本控制查看文件的更改历史记录

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

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

2193797 次浏览

如果您使用gitgui(在Windows上):

Repository菜单下,您可以使用Visualize master's History

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

这让Git为每个日志条目生成补丁:

git log -p -- filename

查看#0了解更多选项-它实际上可以做很多好事。:)


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

git show HEAD

或通过标识符指定任何其他版本。


要直观地浏览更改:

gitk

在这种情况下,#0也相当于#1

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

对于图形视图,使用#0

gitk [filename]

要跨文件重命名跟踪文件:

gitk --follow [filename]

要显示文件的每一行的修订版本和作者上次修改的内容:

git blame filename

或者如果你想使用强大的指责GUI:

git gui blame filename

或:

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

#0是一个基于终端的查看器,其颜色支持类似于基于GUI的#1

快速安装:

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

或通过以下方式浏览详细的存储库历史:tig

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

gitk --all <filename>

我写下载播放就是为了这个目的

pip install git-playbackgit playback [filename]

这样做的好处是既可以在命令行中显示结果(如git log -p),又可以让您使用箭头键(如gitk)逐步完成每个提交。

使用优秀的git扩展,您将转到文件仍然存在的历史记录中的某个点(如果它已被删除,否则只需转到HEAD),切换到File tree选项卡,右键单击文件并选择File history

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

它有一些次要的陷阱,比如在点击删除版本时在View选项卡中显示fatal: Not a valid object name,但我可以忍受。:-)

通读并玩一点后的其他答案摘要:

通常的命令行命令是

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/ubuntu下,这些可爱工具的安装命令如预期的那样:

sudo apt-get install gitk tig

我目前正在使用:

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

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

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

git diff -U <filename>给你一个统一的差异。

它应该在红色和绿色上着色。如果不是,请先运行: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来可视化您的存储库(它是免费的并且非常好),您可以右键单击一个文件并选择日志已选

在此输入图片描述

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

在此输入图片描述

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

  • 未选中“Show Whole Project”选项。

  • All Branches选项被选中。

您还可以尝试此操作,其中列出了更改文件特定部分的提交(在Git 1.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

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

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

安装GitLens后,转到GitLens选项卡,选择FILE HISTORY,您可以浏览它。

在此处输入图片描述

我可能在开始时的OP在哪里,寻找一些简单的东西,让我使用git扩散工具vimdiff来从特定提交开始查看存储库中文件的更改。我对我找到的答案不太满意,所以我把这个git公司remental代表orter(git增量p)脚本扔在一起,它对我很有用:

#!/usr/bin/env bash
STARTWITH="${1:-}"shift 1
DFILES=( "$@" )
RunDiff(){GIT1=$1GIT2=$2shift 2
if [ "$(git diff $GIT1 $GIT2 "$@")" ]thengit log ${GIT1}..${GIT2}git difftool --tool=vimdiff $GIT1 $GIT2 "$@"fi}
OLDVERS=""RUNDIFF=""
for NEWVERS in $(git log --format=format:%h  --reverse)doif [ "$RUNDIFF" ]thenRunDiff $OLDVERS $NEWVERS "${DFILES[@]}"elif [ "$OLDVERS" ]thenif [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]thenRUNDIFF=trueRunDiff $OLDVERS $NEWVERS "${DFILES[@]}"fifiOLDVERS=$NEWVERSdone

在没有args的情况下调用,这将从repo历史记录的开头开始,否则它将以您提供的任何缩写提交哈希开始并继续到现在-您可以随时ctrl-C退出。第一个之后的任何args都会限制差异报告仅包含在这些args中列出的文件(我认为这是OP想要的,我建议除了小项目之外的所有文件)。如果您正在检查想要从头开始的特定文件的更改,您需要为art1提供一个空字符串。如果您不是vim用户,您可以将vimdiff替换为您最喜欢的diff工具。

行为是在找到相关更改时输出提交注释,并开始为每个更改的文件提供vimdiff运行(这是git扩散工具行为,但它在这里有效)。

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

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

在此处输入图片描述

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

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

git rev-list HEAD --oneline FileName


例如

git rev-list HEAD --oneline index.html

产出

7a2bb2f update_index_with_alias6c03e56 update_changese867142 Revert "add_paragraph"

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

git log -p fileName

见gif图像git提交特定文件