如何在 Git 中查看单个文件的更改历史记录,以及更改内容的完整详细信息?
我已经做到了:
git log -- [filename]
它向我显示了文件的提交历史记录,但我如何获得每个文件更改的内容?
我正在尝试从 Microsoft Visual SourceSafe进行转换,这曾经是一个简单的右键单击 → Show history。
如何在 Git 中查看单个文件的更改历史记录,以及更改内容的完整详细信息?
我已经做到了:
git log -- [filename]
它向我显示了文件的提交历史记录,但我如何获得每个文件更改的内容?
我正在尝试从 Microsoft Visual SourceSafe进行转换,这曾经是一个简单的右键单击 → Show history。
对于图形视图,我将使用gitk
:
gitk [filename]
或者按照文件名过去重命名:
gitk --follow [filename]
您可以使用
git log -p -- filename
让 Git 为每个日志条目生成补丁。
看
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
选项确保每次更改都包含差异。
git whatchanged -p filename
git log -p filename
在这种情况下也等价于。
您还可以查看文件中的特定代码行何时更改为git blame filename
. 这将为文件中的每一行打印出一个简短的提交 ID、作者、时间戳和完整的代码行。在您发现错误并且想知道它是什么时候引入的(或者是谁的错)之后,这非常有用。
如果您使用 Sourcetree 来可视化您的存储库(它是免费的并且非常好),您可以右键单击一个文件并选择Log Selected
显示(下图)比gitk和列出的大多数其他选项更友好。不幸的是(此时)没有简单的方法可以从命令行启动这个视图——Sourcetree 的 CLI 目前只是打开存储库。
要显示上次修改文件每一行的版本和作者:
git blame filename
或者如果你想使用强大的责备 GUI:
git gui blame filename
阅读并玩了一下其他答案的摘要:
通常的命令行命令是
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
。
将此别名添加到您的 .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 输出几乎完全相同。享受。
最近我发现tig
并发现它非常有用。在某些情况下,我希望它是 A 或 B,但大多数时候它相当整洁。
对于您的情况,tig <filename>
可能是您正在寻找的。
你也可以试试这个,它列出了更改文件特定部分的提交(在 Git 1.8.4 中实现)。
返回的结果将是修改此特定部分的提交列表。命令:
git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
其中,upperLimit 是起始行号,lowerLimit 是文件的结束行号。
更多详情见https://web.archive.org/web/20210120153550/http://techpurohit.com/list-some-useful-git-commands。
我为此目的写了git-playback
pip install git-playback
git playback [filename]
这样做的好处是既可以在命令行中显示结果(例如git log -p
),又可以让您使用箭头键逐步完成每个提交(例如gitk
)。
如果您想查看文件的整个历史记录,包括所有其他分支,请使用:
gitk --all <filename>
如果您使用的是Git GUI(在 Windows 上):
在 Repository 菜单下,您可以使用“Visualize master's History”。突出显示顶部窗格中的提交和右下角的文件,您将在左下角看到该提交的差异。
使用出色的Git Extensions,您可以转到文件仍然存在的历史记录中的某个点(如果它已被删除,否则只需转到 HEAD),切换到File tree
选项卡,右键单击文件并选择File history
.
默认情况下,它通过重命名跟随文件,并且Blame
选项卡允许查看给定修订的名称。
它有一些小问题,例如单击删除修订时fatal: Not a valid object name
在View
选项卡中显示,但我可以忍受。:-)
聪明的:
我要找的答案不在这里。这是为了查看我为提交暂存的文件中的更改。IE,
git diff --cached
如果您使用 TortoiseGit,您应该能够右键单击该文件并执行TortoiseGit --> Show Log
. 在弹出的窗口中,确保:
' Show Whole Project
' 选项未选中。
' All Branches
' 选项被选中。
git diff -U <filename>
给你一个统一的差异。
它应该用红色和绿色着色。如果不是,请运行:git config color.ui auto
首先。
如果您将Eclipse与 Git 插件一起使用,它有一个很好的历史比较视图。右键单击文件并选择“比较”→“历史记录”。
我可能是关于 OP 开始时的位置,寻找一些简单的东西,让我可以使用git difftool和vimdiff来查看从特定提交开始对我的 repo 中文件的更改。我对找到的答案不太满意,所以我把这个git inc remental rep orter (gitincrep) 脚本放在一起,它对我很有用:
#!/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运行(这是git difftool行为,但它在这里有效)。
这种方法可能非常幼稚,但是在这里和相关帖子中查看了很多解决方案,其中许多涉及在我没有管理员访问权限的系统上安装新工具,并且界面有自己的学习曲线。上面的脚本做了我想要的,没有处理任何这些。当我需要更复杂的东西时,我会在这里研究许多优秀的建议——但我认为这直接响应了 OP。