如何在Git中查看单个文件的更改历史记录以及更改后的完整详细信息?
我到目前为止:
git log -- [filename]
它向我显示了文件的提交历史记录,但是如何获得每个文件更改的内容?
我正在尝试从MS SourceSafe进行过渡,该过渡曾经是一个简单的right-click
→ show history
。
如何在Git中查看单个文件的更改历史记录以及更改后的完整详细信息?
我到目前为止:
git log -- [filename]
它向我显示了文件的提交历史记录,但是如何获得每个文件更改的内容?
我正在尝试从MS SourceSafe进行过渡,该过渡曾经是一个简单的right-click
→ show history
。
Answers:
为此,我将使用:
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
选项确保每个更改都包含差异。
--follow
确保您看到文件重命名(2.)-p
确保您看到文件如何更改(3.)仅命令行。
--
已添加,但我不知道为什么这样做会更好?它是做什么的?
--
选项告诉Git它已经到达选项的末尾,其后的所有内容--
都应视为参数。因为git log
只有路径名称以破折号开头,这才有意义。假设您想知道一个文件名称为“ --follow”的文件的历史记录:git log --follow -p -- --follow
--
很有用,因为它还可以防止与revision
您输入的文件名匹配的任何名称,这实际上可能很吓人。例如:如果您同时有一个分支和一个名为的文件foo
,git log -p foo
则将显示git日志的历史记录foo
,而不是该文件 的历史记录foo
。但是@DanMoulding是正确的,因为该--follow
命令仅将单个文件名作为其参数,所以它的必要性较小,因为它不能为revision
。我才知道 也许您是正确的,然后将其排除在答案之外;我不确定。
git whatchanged -p filename
git log -p filename
在这种情况下也等效。
您还可以查看何时使用更改了文件中的特定代码行git blame filename
。这将为文件中的每一行打印出简短的提交ID,作者,时间戳和完整的代码行。当您发现一个错误并想知道它何时被引入(或它是谁的错)之后,这非常有用。
filename
在command中不是可选的git blame filename
。
如果您使用SourceTree可视化您的存储库(它是免费的,还算不错),您可以右键单击一个文件并选择Log Selected
下方的显示比gitk和列出的大多数其他选项友好得多。不幸的是(目前),没有一种简单的方法可以从命令行启动此视图-SourceTree的CLI当前仅打开存储库。
阅读并玩一些后的其他答案的摘要:
通常的命令行命令是
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
。
--all
适用于所有分支机构,其余部分在
将此别名添加到您的.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
-它返回搜索文件的漂亮差异。
最近我发现 tig
它非常有用。在某些情况下,我希望它可以执行A或B操作,但大多数情况下它都比较整洁。
对于您的情况,tig <filename>
可能就是您想要的。
我写git-playback就是为了这个目的
pip install git-playback
git playback [filename]
这样的好处是既可以在命令行中显示结果(如git log -p
),又可以让您使用箭头键(如gitk
)逐步完成每个提交。
如果你想查看文件的全部历史,包括对所有其他分支机构使用:
gitk --all <filename>
您也可以尝试使用它列出更改了文件特定部分的提交(在Git 1.8.4中实现)。
返回的结果将是修改此特定部分的提交列表。命令:
git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
其中upperLimit是文件的起始行号,lowerLimit是文件的结束行号。
有关更多详细信息,请访问https://www.techpurohit.com/list-some-useful-git-commands
使用出色的Git扩展程序,您可以转到历史记录中文件仍然存在的位置(如果已删除,否则转到HEAD),切换到File tree
选项卡,右键单击文件并选择File history
。
默认情况下,它通过重命名跟随文件,并且Blame
选项卡允许查看给定修订版本的名称。
它有一些小问题,例如单击删除修订时显示fatal: Not a valid object name
在View
选项卡中,但我可以接受。:-)
我一直在寻找的答案不在此线程中,是为了查看我准备提交的文件中的更改。即
git diff --cached
git diff origin/master
以展示您的本地分支和master分支之间的完整差异(可以通过远程更新git fetch
)
如果您使用TortoiseGit,则应该可以右键单击该文件并执行TortoiseGit --> Show Log
。在弹出的窗口中,确保:
' Show Whole Project
'选项未选中。
' All Branches
'选项被选中。
git diff -U <filename>
给你一个统一的差异。
它应该被涂成红色和绿色。如果不是,git config color.ui auto
请先运行:
如果您将eclipse与git插件配合使用,则它具有与历史记录的出色对比视图。右键单击该文件,然后选择“与...比较” =>“历史记录”
我可能是关于OP何时开始的地方,正在寻找一个简单的方法,使我可以将git difftool与vimdiff一起使用,以从特定的提交开始查看仓库中文件的更改。我对找到的答案不太满意,所以我把这个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。