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

时间:2008-11-10 15:42:33

标签: git git-log

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

我到目前为止:

git log -- [filename]

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

我正在尝试从MS SourceSafe转换,过去只是一个简单的right-clickshow history

25 个答案:

答案 0 :(得分:2170)

为此,我会使用:

gitk [filename]

或按照文件名过去重命名

gitk --follow [filename]

答案 1 :(得分:2025)

您可以使用

git log -p filename

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

git help log

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

git show HEAD 

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

gitk

直观地浏览更改。

答案 2 :(得分:1353)

git log --follow -p -- path-to-file

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

换句话说,如果名为bar的文件曾被命名为foo,那么git log -p bar(没有--follow选项)将仅显示文件的历史记录它被重命名的位置 - 当它被称为foo时,它不会显示文件的历史记录。使用git log --follow -p bar将显示文件的整个历史记录,包括文件被称为foo时所做的任何更改。 -p选项可确保每次更改都包含差异。

答案 3 :(得分:158)

如果您希望保留基于文本的内容,则可能需要使用 tig

快速安装:

  • apt-get # apt-get install tig
  • 自制程序(OS X)$ brew install tig

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

gitk类似,但基于文字。在终端支持颜色!

答案 4 :(得分:109)

在这种情况下,

git whatchanged -p filename也相当于git log -p filename

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

答案 5 :(得分:96)

SourceTree用户

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

enter image description here

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

enter image description here

答案 6 :(得分:61)

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

git blame filename

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

git gui blame filename

答案 7 :(得分:45)

阅读完并阅读后的其他答案摘要:

通常的命令行命令是

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下,这些可爱工具的install命令符合预期:

sudo apt-get install gitk tig

我目前正在使用:

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

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

答案 8 :(得分:23)

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

答案 9 :(得分:20)

最近我发现tig并发现它非常有用。在某些情况下,我希望它能做到A或B,但大部分时间它都很整洁。

对于您的情况,tig <filename>可能就是您要找的。

http://jonas.nitro.dk/tig/

答案 10 :(得分:15)

为了这个目的,我写了git-playback

pip install git-playback
git playback [filename]

这样既可以在命令行中显示结果(如git log -p),也可以使用箭头键(如gitk)逐步完成每次提交。

答案 11 :(得分:13)

或者:

gitx -- <path/to/filename>

如果您使用gitx

答案 12 :(得分:9)

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

gitk --all <filename>

答案 13 :(得分:7)

如果您在Repository菜单下使用git GUI(在Windows上),则可以使用“Visualize master's History”。突出显示顶部窗格中的提交和右下角的文件,您将在左下方看到该提交的差异。

答案 14 :(得分:7)

使用优秀的Git Extensions,您将转到文件仍然存在的历史记录中的一个点(如果已删除,否则只需转到HEAD),切换到File tree标签,右键 - 点击该文件,然后选择File history

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

它有一些小问题,比如在点击删除修订版时在fatal: Not a valid object name标签中显示View,但我可以忍受。 : - )

答案 15 :(得分:5)

您也可以尝试使用此列出已更改文件特定部分的提交(在Git 1.8.4中实现)。

返回的结果将是修改此特定部分的提交列表。命令:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

其中upperLimit是start_line_number,lowerLimit是文件的ending_line_number。

https://www.techpurohit.com/list-some-useful-git-commands

的更多详情

答案 16 :(得分:5)

<强> SmartGit

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

答案 17 :(得分:4)

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

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

  • 选中“All Branches”选项。

答案 18 :(得分:4)

我正在寻找的答案不是在这个帖子中看到我为了提交而上演的文件的变化。即。

git diff --cached

答案 19 :(得分:4)

在Sourcetree UI(https://www.sourcetreeapp.com/)中,您可以通过右键单击上下文菜单中的“ Log Selected”选项来找到文件的历史记录:

enter image description here

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

答案 20 :(得分:3)

git diff -U <filename>为您提供统一的差异。

它应该是红色和绿色。如果不是,请先运行:git config color.ui auto

答案 21 :(得分:2)

如果你正在使用带有git插件的eclipse,它有一个很好的历史比较视图。右键单击该文件,然后选择“与...比较”=&gt; “历史”

答案 22 :(得分:0)

您可以将vscode与GitLens一起使用,这是一个非常强大的工具。 安装GitLens后,转到GitLens选项卡,选择FILE HISTORY,然后可以浏览它。

enter image description here

答案 23 :(得分:0)

显示文件的整个历史记录(包括重命名后的历史记录):

git log --follow -p -- <file>

答案 24 :(得分:0)

我大概是关于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的直接响应。