如何查看文件的完整变更历史记录以及具体修改内容?
git log -- [filename]
命令可以显示文件的提交历史,但如何查看文件的修改内容呢?
git log -p -- filename
git help log
— 它实际上可以做很多好玩的事情。 :)
git show HEAD
gitk
git log --follow -p -- path-to-file
这将展示文件的完整历史记录(包括重命名之后的历史和每个更改的差异)。
换句话说,如果名为bar
的文件曾经被命名为foo
,那么git log -p bar
(不带--follow
选项)只会显示文件的历史记录到它被重命名的那个时间点为止 -- 它不会显示文件作为foo
时的历史记录。使用git log --follow -p bar
将显示文件的完整历史记录,包括文件作为foo
时的任何更改。 -p
选项确保每个更改的差异都被包含在内。
--follow
确保你能看到文件重命名 (2.) -p
确保你能看到文件如何被更改 (3.) 这只能在命令行中运行。 - Trevor Boyd Smith--
被添加了,但我不知道这为什么会使它更好?它有什么作用? - Benjohngit log
命令而言,只有当您有一个以破折号开头的路径名称时,这才有所区别。假设您想要查看文件“--follow”的历史记录:git log --follow -p -- --follow
。 - Dan Moulding--
是有用的,因为它还可以防止与您输入的文件名相匹配的任何 revision
名称,这可能会令人感到恐慌。例如:如果您同时拥有一个名为 foo
的分支和文件,则 git log -p foo
将显示直到 foo
的 git 日志历史记录,而不是文件 foo
的历史记录。但是 @DanMoulding 是正确的,因为 --follow
命令只需要单个文件名作为其参数,所以这种情况就不那么必要了,因为它不能是一个 revision
。我刚学到这一点。也许您在回答中将其省略是正确的,我不确定。 - NHDalytig -- path/to/specific/file
。 - gloriphobiagit whatchanged -p filename
在这种情况下也等同于 git log -p filename
。
你还可以使用 git blame filename
查看文件中特定代码行的更改时间。对于文件中的每一行,它会打印出一个短的提交 ID、作者、时间戳和完整的代码行。当你发现一个 bug 并想知道是什么时候引入的(或者是谁的错)时,这非常有用。
如果您使用Sourcetree来可视化您的代码库(它是免费且相当不错的),您可以右键单击文件并选择Log Selected。
显示结果(如下所示)比gitk和其他大多数选项更加友好。不幸的是,目前没有简单的方法从命令行启动此视图。Sourcetree的CLI目前只打开代码库。
gitk
查找 SHA1
哈希值,然后打开 SourceTree
根据找到的 SHA1
输入 Log Selected..
。 - AechoLiu显示文件每行的修订版本和最后修改者:
git blame filename
或者如果您想使用强大的责备图形界面:
git gui blame filename
在阅读其他答案和尝试了一些操作后,以下是它们的总结:
通常的命令行命令应该是:
git log --follow --all -p dir/file.c
但你也可以使用 gitk(图形用户界面)或 tig(文本用户界面)以更加易读的方式查看它。
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
中所有内容的重点历史记录。
--all
表示所有分支,其余内容详见 @Dan 的回答。 - cregox你可以使用 Visual Studio Code 与 GitLens。这是一个非常强大的工具。
安装完 GitLens 后,进入 GitLens 标签,选择 FILE HISTORY
,就可以浏览它了。
donjayamanne.githistory
- Felix F Xu将此别名添加到您的.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 输出相同。享受吧。
git lg -p filename
命令,它会返回所搜索的文件的漂亮差异。 - Egel