如何让git log显示像svn log -v这样的文件名


987

SVN的日志具有“ -v”模式,该模式输出每次提交中更改的文件的文件名,如下所示:

jes5199 $ svn日志-v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800(2007年1月3日,星期三)| 1线
更改的路径:
   A /作者
   A /正在复制
   /更改日志
   /进化
   A /安装
   一个/ MacOSX

有没有一种快速的方法来获取git中每次提交中已更改文件的列表?


15
想知道为什么git log不仅仅支持-v这么多期望/想要的开关?</
gripe

Answers:


1528

对于已更改文件的完整路径名:

git log --name-only

有关更改文件的完整路径名和状态:

git log --name-status

对于缩写的路径名和已更改文件的diffstat:

git log --stat

还有更多选择,请查阅docs


17
我用git log --numstat。请参阅git help log以获取更多选项。
ma11hew28

29
git log --name-only --oneline也是很漂亮的-提交的颜色是一行,每行一个文件。stackoverflow.com/a/14227496/1995714
cp.engr

4
在git 2.7.3中,我不得不使用git log --name-status --find-renames它来显示重命名的文件,而不是添加或删除。
苏珊·杜彭(SuzanneDupéron)

1
注意,--stat缩写为长路径;宽度是可配置的,但是包裹的直方图更难阅读。其他格式(如--numstat始终打印完整路径)。
贝尼·切尔尼亚夫斯基-帕斯金,

@ ma11hew28谢谢。--numstat自git 2.22.00起位于该手册页的第946行。这是一个很大更多的选择比大多数人所需要的。
恢复莫妮卡-M.Schröder

139

注意:已弃用,请改用 git whatchangedgit log

鼓励新用户改用 git-log [1]。该 whatchanged命令本质上与git-log [1]相同, 但是默认情况下显示原始格式diff输出并跳过合并。

该命令的保留主要是出于历史原因;早在git log通过阅读Linux内核邮件列表而发明Git的许多人的手指中就受过训练来键入它。


您可以使用该命令git whatchanged --stat来获取每次提交中已更改的文件的列表(以及提交消息)。

参考文献


50

git show 这也是一个很好的命令。

有点像svn diff,但是您可以将其提交为guid并查看差异。


46

如果只想获取文件名而不提交其余的提交消息,则可以使用:

git log --name-only --pretty=format: <branch name>

然后可以将其扩展为使用包含文件名的各种选项:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

使用此方法时要注意的一件事是,输出中有些空白行必须忽略。如果要查看在本地分支上已更改但尚未推送到远程分支的文件,并且不能保证已从远程获取最新文件,则使用此功能很有用。 :

git log --name-only --pretty=format: my_local_branch --not origin/master

将显示本地分支上已更改但尚未合并到远程主机上的所有分支的所有文件。


1
请注意上述示例中的空白-就像git log --stat --pretty="format:" $branchName。因此,例如 git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD)。在执行此操作时,以下确切的咒语与我的目的有关:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
随心所欲

41

我每天使用它来显示已更改文件的历史记录:

git log --stat --pretty=short --graph

为了简短起见,请.gitconfig通过以下操作在您的计算机中添加别名:

git config --global alias.ls 'log --stat --pretty=short --graph'

我的情况非常接近git log --pretty = oneline --graph --name-status。我发现它更加简洁,仅显示了已更改文件的列表。
彼得·苏瓦拉

15

我用这个:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

仅输出文件及其状态(添加,修改,删除)的列表:

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!显示上次提交(HEAD)的更改的文件和添加/删除的行数。

在我看来,没有哪个命令可以获取仅包含文件名的简明输出,并且一次可以添加和删除多个提交的行数,因此我为此创建了自己的bash脚本:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

被称为例如。./changed_files 99以简洁的形式将更改从转换HEADHEAD~99。可以用管道输送。到less


git diff --stat HEAD..master无法显示HEAD和master之间的区别吗?还是在2012年发布答案时不存在?
Ferrybig '17

1
@Ferrybig OP的问题是关于“如何在每次提交中获取已更改文件的列表”,而不是和之间的区别。那是两件事。HEADmaster
nrz

4

我发现以下是以简洁的格式列出每次提交更改的文件的理想显示:

git log --pretty=oneline --graph --name-status

3

示例输出的答案摘要

这是使用具有五个简单提交的本地存储库。

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


感谢@ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

另一个有用的命令是git diff-tree <hash>,哈希也可以是哈希范围(用<old>..<new>符号表示)。输出示例:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

字段是:

源模式,目标模式,源哈希,目标哈希,状态,文件名

状态是您期望的状态:D(已删除),A(已添加),M(已修改)等。有关完整说明,请参见手册页。


0

我通常使用这些来获取日志:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
我不知道这些选项,但是如果该帖子解释说它可以过滤日志,那么它将更加有用。有一会儿,我认为这是一种更改输出中列出作者的方式。
斯坦因
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.