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


如何在Git中查看单个文件的更改历史记录,完整的详细信息?

我有:

git log -- [filename]

它显示了文件的提交历史记录,但是如何获取每个文件更改的内容?

我正在尝试从MS SourceSafe过渡,而过去这很简单 right-click → show history


2510
2017-11-10 15:42


起源


以上链接不再有效。此链接今天正在运行: Git社区书 - chris


答案:


为此,我会使用:

gitk [filename]

或者按照文件名过去重命名

gitk --follow [filename]

1951
2017-08-24 12:05



但我甚至有一个工具将上面的内容与'git blame'相结合,允许我浏览文件的来源,因为它随时间变化...... - Egon Willighagen
不幸的是,这并不遵循过去重命名的文件的历史记录。 - Dan Moulding
我还在寻找以前重命名过的文件的历史记录,并首先找到了这个帖子。菲尔指出,解决方案是使用“git log --follow <filename>” 这里。 - Florian Gutmann
作者正在寻找命令行工具。虽然gitk带有GIT,但它既不是命令行应用程序,也不是特别好的GUI。 - mikemaccana
他在寻找命令行工具吗? “右击 - >显示历史”当然不暗示它。 - hdgarrood


您可以使用

git log -p filename

让git为每个日志条目生成补丁。

看到

git help log

更多选项 - 它实际上可以做很多好事:)为了获得特定提交的差异你可以

git show HEAD 

或标识符的任何其他修订。或者使用

gitk

以可视方式浏览更改。


1836
2017-11-10 15:56



git show HEAD显示所有文件,你知道如何跟踪单个文件(正如理查德所要求的那样)? - Jonas Byström
你使用:git show <revision> - filename,它将显示该修订的差异,如果存在的话。 - Marcos Oliveira
--stat也很有帮助。您可以将它与-p一起使用。 - Raffi Khatchadourian
这很棒。指定不再存在的路径时,gitk表现不佳。我用git log -p-path。 - Paulo Casaretto
加上gitk看起来像是由布吉怪物建造的。这是一个很好的答案,最适合原始问题。 - ghayes


git log --follow -p -- file

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

换句话说,如果文件名为 bar 曾经被命名 foo, 然后 git log -p bar (没有 --follow 选项)只会显示文件的历史记录,直到它被重命名为止 - 当它被称为文件时,它不会显示文件的历史记录 foo。运用 git log --follow -p bar 将显示文件的整个历史记录,包括文件被称为时的任何更改 foo。该 -p 选项确保每次更改都包含差异。


1187
2018-03-30 23:25



--stat也很有帮助。您可以将它与-p一起使用。 - Raffi Khatchadourian
丹的答案是唯一真实的答案! git log --follow -p file - zzeroo
我同意这是真实的答案。 (1.) --follow 确保您看到文件重命名(2.) -p 确保您看到文件的更改方式(3.)它只是命令行。 - Trevor Boyd Smith
@Benjohn -- 选项告诉Git它已经到达选项的末尾以及随后的任何内容 -- 应该被视为一个论点。对于 git log 如果您的路径名以a开头,那么这只会有所不同 短跑。假设您想知道具有不幸名称“--follow”的文件的历史记录: git log --follow -p -- --follow - Dan Moulding
@Benjohn:通常, -- 是有用的,因为它也可以防范任何 revision 与您输入的文件名匹配的名称,这实际上可能很吓人。例如:如果您同时拥有一个分支和一个名为的文件 foo, git log -p foo 会显示git日志历史记录 foo,而不是历史 文件  foo。但@DanMoulding是正确的,因为 --follow 命令只接受一个文件名作为参数,这不太必要,因为它不能是一个 revision。我刚学会了这个。也许你把它从你的答案中删除是对的;我不确定。 - NHDaly


如果您希望保持基于文本,则可能需要使用 TIG

快速安装:

  • apt-get的# apt-get install tig 
  • Homebrew(OS X)$ brew install tig

使用它来查看单个文件的历史记录: tig [filename]
或浏览详细的回购历史记录: tig

如同 gitk 但是基于文本。终端支持颜色!


147
2018-06-07 10:23



优秀的基于文本的工具,很棒的答案。当我在无头服务器上看到gitk安装的依赖关系时,我吓坏了。将再次投票A +++ - Tom McKenzie
您也可以使用tig查看特定文件,即 tig -- path/to/specific/file - gloriphobia


git whatchanged -p filename 也相当于 git log -p filename 在这种情况下。

您还可以查看文件中特定代码行的更改时间 git blame filename。这将为文件中的每一行打印出一个简短的提交ID,作者,时间戳和完整的代码行。 在找到错误并且想知道它何时被引入(或者它是谁的错误)之后,这非常有用。


102
2017-11-11 06:12



+1,但是 filename 在命令中不是可选的 git blame filename。 - rockXrock
“鼓励新用户使用git-log。(...)该命令主要是出于历史原因;” - ciastek


SourceTree用户

如果您使用SourceTree可视化您的存储库(它是免费且非常好),您可以右键单击文件并选择 记录已选中

enter image description here

显示屏(下方)比gitk更友好,列出的大多数其他选项。不幸的是(此时)没有简单的方法从命令行启动此视图 - SourceTree的CLI目前只打开repos。

enter image description here


92
2017-07-30 18:55



我特别喜欢“跟随重命名的文件”选项,它允许您查看文件是否已重命名或移动。 - Chris
但除非我弄错了(请让我知道!),人们只能在gui中一次比较两个版本?是否有任何客户端具有优雅的界面,可以同时区分几个不同的版本?可能有像Sublime Text一样的缩小视图?我认为这非常有用。 - Sam Lewallen
@SamLewallen如果我理解正确你要比较三个不同的提交?这听起来类似于三向合并(我的,你的,基础) - 通常这种策略用于解决合并冲突,而不一定比较三个任意提交。有许多工具支持三向合并 stackoverflow.com/questions/10998728/... 但诀窍是为这些工具提供特定的修订 gitready.com/intermediate/2009/02/27/... - Mark Fox
谢谢马克福克斯,这就是我的意思。你碰巧知道任何会这样做的应用吗? - Sam Lewallen
你救了我的命。您可以使用 gitk 找到了 SHA1 哈希,然后打开 SourceTree 进入 Log Selected.. 根据发现 SHA1。 - AechoLiu


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

git blame filename

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

git gui blame filename

57
2017-08-11 13:01





通过阅读并播放后的其他答案摘要:

通常的命令行命令是

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

但是你也可以使用gitk(gui)或tig(text-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


40
2017-12-05 18:38



我认为这是一个很好的答案。也许你没有得到投票,因为你回答其他方式(恕我直言更好)看到变化,即通过gitk和tig除了git。 - PopcornKing
只是添加回答。找到路径(在git空间中,仍然存在于存储库中)。然后使用上面提到的命令“git log --follow --all -p <folder_path / file_path>”。可能存在这样的情况:filde /文件夹将在历史记录中被删除,因此找到仍然存在的最大路径,并尝试获取其历史记录。工作! - parasrish
--all 适用于所有分支机构,其余部分在@ Dan的答案中解释 - cregox


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


22
2018-06-26 20:12



在我运行lg快捷方式之后,我说(并且我引用)“美丽!”。但是,请注意“--graph”之后的“\ n”是一个错误。 - jmbeck
也可以使用 git lg -p filename  - 它返回搜索文件的漂亮差异。 - Egel


我写了 混帐回放 为了这个目的

pip install git-playback
git playback [filename]

这样做的好处是可以在命令行中显示结果(比如 git log -p)同时也允许您使用箭头键(如 gitk)。


14
2017-11-19 06:25





要么:

gitx -- <path/to/filename>

如果你正在使用 gitx


13
2017-09-17 16:50



出于某种原因,我的gitx打开了空白。 - Igor Ganapolsky
@IgorGanapolsky您必须确保您位于git存储库的根目录 - zdsbs