3503

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

我已经做到了:

git log -- [filename]

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

我正在尝试从 Microsoft Visual SourceSafe进行转换,这曾经是一个简单的右键单击 → Show history

4

24 回答 24

2618

对于图形视图,我将使用gitk

gitk [filename]

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

gitk --follow [filename]
于 2009-08-24T12:05:51.537 回答
2590

您可以使用

git log -p -- filename

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

git help log

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

git show HEAD

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

gitk

以直观地浏览更改。

于 2008-11-10T15:56:44.393 回答
1689

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

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

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

于 2011-03-30T23:25:11.130 回答
190

如果您更喜欢基于文本,您可能需要使用tig

快速安装:

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

使用它来查看单个文件的历史记录:tig [filename]

或浏览详细的存储库历史记录:tig

它类似于gitk,但基于文本。它支持终端中的颜色!

于 2012-06-07T10:23:33.150 回答
124

git whatchanged -p filenamegit log -p filename在这种情况下也等价于。

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

于 2008-11-11T06:12:16.553 回答
116

源树用户

如果您使用 Sourcetree 来可视化您的存储库(它是免费的并且非常好),您可以右键单击一个文件并选择Log Selected

在此处输入图像描述

显示(下图)比gitk和列出的大多数其他选项更友好。不幸的是(此时)没有简单的方法可以从命令行启动这个视图——Sourcetree 的 CLI 目前只是打开存储库。

在此处输入图像描述

于 2013-07-30T18:55:48.307 回答
72

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

git blame filename

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

git gui blame filename
于 2010-08-11T13:01:24.953 回答
60

阅读并玩了一下其他答案的摘要:

通常的命令行命令是

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

于 2012-12-05T18:38:20.240 回答
29

您可以将 Visual Studio Code 与GitLens一起使用。这是一个非常强大的工具。

安装 GitLens 后,进入 GitLens 选项卡,选择FILE HISTORY并浏览它。

在此处输入图像描述

于 2019-05-14T04:08:29.140 回答
28

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

于 2013-06-26T20:12:30.963 回答
23

最近我发现tig并发现它非常有用。在某些情况下,我希望它是 A 或 B,但大多数时候它相当整洁。

对于您的情况,tig <filename>可能是您正在寻找的。

https://jonas.github.io/tig/

于 2015-11-10T11:53:57.213 回答
16

你也可以试试这个,它列出了更改文件特定部分的提交(在 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

于 2015-08-13T05:41:19.673 回答
15

我为此目的写了git-playback

pip install git-playback
git playback [filename]

这样做的好处是既可以在命令行中显示结果(例如git log -p),又可以让您使用箭头键逐步完成每个提交(例如gitk)。

于 2012-11-19T06:25:32.557 回答
14

或者:

gitx -- <path/to/filename>

如果您使用的是gitx

于 2010-09-17T16:50:30.143 回答
11

Sourcetree UI 中,您可以通过在右键单击上下文菜单中选择“Log Selected”选项来查找文件的历史记录:

在此处输入图像描述

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

于 2020-03-31T01:28:27.733 回答
9

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

gitk --all <filename>
于 2012-08-07T13:57:47.363 回答
8

如果您使用的是Git GUI(在 Windows 上):

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

于 2008-11-10T15:56:29.307 回答
7

使用出色的Git Extensions,您可以转到文件仍然存在的历史记录中的某个点(如果它已被删除,否则只需转到 HEAD),切换到File tree选项卡,右键单击文件并选择File history.

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

它有一些小问题,例如单击删除修订时fatal: Not a valid object nameView选项卡中显示,但我可以忍受。:-)

于 2012-11-28T15:58:50.320 回答
6

聪明的

  1. 在菜单中启用以显示未更改的文件:查看/显示未更改的文件
  2. 右键单击文件并选择“日志”或按“Ctrl-L”
于 2016-06-01T10:44:13.030 回答
5

我要找的答案不在这里。这是为了查看我为提交暂存的文件中的更改。IE,

git diff --cached
于 2011-12-01T05:24:23.167 回答
5

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

  • ' Show Whole Project' 选项未选中。

  • ' All Branches' 选项被选中。

于 2015-08-12T21:22:40.653 回答
4

git diff -U <filename>给你一个统一的差异。

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

于 2013-05-20T17:17:01.760 回答
2

如果您将Eclipse与 Git 插件一起使用,它有一个很好的历史比较视图。右键单击文件并选择“比较”→“历史记录”。

于 2013-01-02T19:35:17.630 回答
1

我可能是关于 OP 开始时的位置,寻找一些简单的东西,让我可以使用git difftoolvimdiff来查看从特定提交开始对我的 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。

于 2020-03-27T19:43:59.657 回答