如何列出一次提交中的所有文件?


2790

我正在寻找一个简单的git命令,该命令将提供所有文件的格式良好的列表,这些文件是哈希(SHA1)所提交的提交的一部分,没有任何多余的信息。

我努力了:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

尽管它列出了文件,但每个文件都包含不需要的差异信息。

是否有另一个git命令将仅提供我想要的列表,以便避免从git show输出中解析它?


43
我是来这里找东西的。我想查看所有修改了一组提交的文件,并且使用git log --until 2013-05-21 --pretty="short" --name-only起来效果很好。
有限赎罪2013年

4
使用此命令可获取以前n提交之前的所有更改mastergit diff-tree --name-status -r @{3} master
ako 2015年

3
git diff --name-only master-与主分支相比,列出当前分支上所有已更改的文件。
Noam Manos

Answers:


3757

首选方式(因为这是一条管道命令;是编程的):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

另一种方式(脚本不那么受欢迎,因为它是一个瓷器命令;意味着面向用户)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • --no-commit-id抑制提交ID输出。
  • --pretty参数指定一个空的格式字符串,以避免开头出现压缩。
  • --name-only参数仅显示受影响的文件名(谢谢汉克)。使用--name-status相反,如果你想看看发生了什么,以每个文件(d eleted,中号 odified,一个 dded)
  • -r参数是递归到子树

25
应该注意的是,diff-tree在查看根提交时将不起作用。
jbranchaud 2013年

327
用替换该--name-only选项--name-status将提供更清晰的摘要。
Kurt Zhong

20
如果您希望它在root提交上起作用,请使用--root标志。在手册页中:“指定--root时,初始提交将显示为大型创建事件。这等效于与NULL树的差异。”
克里斯(Chris

24
git log --name-only -n 1 <hash>最后一次提交是:git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
如果有人想知道(像我一样)为什么第一种方法是“首选”的,它可以追溯到@drizzt的评论; git show是“瓷”(意为面向用户),git diff-tree是“管道”(意为以编程方式使用,例如从脚本中使用)。出于可用性的原因,前者的接口可能会随时间变化(因此git维护者可能会掉下来,--name-only尽管我并不认为会改变),而出于兼容性的原因,后者的接口将保持尽可能稳定。
killscreen

237

如果要获取已更改文件的列表:

git diff-tree --no-commit-id --name-only -r <commit-ish>

如果要获取提交中所有文件的列表,可以使用

git ls-tree --name-only -r <commit-ish>

1
具有--name-only的ls树在1.6.4.4或1.6.3.3上似乎不起作用。您认为这是一个错误吗?
krosenvold

git ls-tree --name-only HEAD(<commit-ish>参数是必需的;在此示例中为HEAD)对我来说适用于git版本1.6.4.3
JakubNarębski09年

2
事实证明,这里的参数顺序很重要。帖子中的一个无效,而响应的一个有效-至少直到更新您的帖子为止;)
krosenvold

5
通过--no-commit-id以避免打印SHA1,如下所示:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor 2012年

3
@CoDEmanX:您不会错过添加-r/ -t选项,对吗?因为diff-tree同时处理修改过的文件和添加的文件。如果要列出所有新的(添加的)文件,请使用git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
JakubNarębski2015年

226

我只是假设这gitk是不需要的。在这种情况下,请尝试git show --name-only <sha>


36
--name-only在我需要的大多数情况下足够了;因此,建议使用最短的解决方案(也是我在1次尝试中记得的唯一解决方案)。
Erik

25
或者--name-status
尼尔·特拉夫特

作为真正喜欢CLI git的人,gitk实际上是一种不错的方式来查看文件并显示差异所在的文件。例如,代码审查了来自同伴的怪物提交。
伊利亚·林恩

192

我个人将--stat--onelineshow命令结合使用:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

如果您不喜欢/不想添加/删除统计信息,可以将--stat替换为--name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

4
这很棒!它基本上为您提供了Github在提交视图顶部显示的文件摘要。谢谢。
trisweb 2013年

非常好。定义别名:alias gits='git show --stat --oneline',然后gits本身显示最新更改(在HEAD中),而gits b24f5fb可用于显示任何修订的更改。
布伦特·浮士德

5
也可以创建一个git别名...例如git config --global alias.changes 'show --stat --oneline'。然后,您可以键入git changes(带有可选的commit-ish)并从上面的第一个示例获取输出。
lindes

Windows的Git需要双引号:git config --global alias.changes "show --stat --oneline"
Alchemistmatt

3
真好 并且与已接受的答案不同,git show它还可以用于审阅隐藏的更改:例如git show --stat --oneline stash@{1}
Jeff Ward

83

你也可以

git log --name-only

您可以浏览各种提交,提交消息和更改的文件。

键入q以返回提示。


谢谢,有帮助。顺便说一句:用于git show 5944ad2a8b5 --name-only列出特定提交的名称
LiuWenbin_NO。

68

最近,我需要列出两次提交之间所有已更改的文件。所以我用了这个(也是* nix专用的)命令

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

更新:或如伊森指出以下

git diff --name-only START_COMMIT..END_COMMIT

使用--name-status还将在每个文件旁边包含更改(添加,修改,删除等)

git diff --name-status START_COMMIT..END_COMMIT

4
如果使用,git diff --name-status START_COMMIT..END_COMMIT则不需要尾随|sort | uniq
伊桑(Ethan)2013年

对上述评论的更正:git diff --name-only START_COMMIT..END_COMMIT
Ethan 2013年

这就是我想要的。我如何使用它:git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'。我只想为大型公关添加了数千个PNG和XML布局的代码更改列表。
AutonomousApps

63

最简单的形式:

git show --stat (hash)

这更容易记住,它将为您提供所需的所有信息。

如果您只需要文件名,则可以添加该--name-only选项。

git show --stat --name-only (hash)


2
--name-only仍将包含几个标题行,其中包含诸如作者,日期和提交消息之类的信息。
吞噬了极乐世界,2016年

唯一一个我发现,对于合并作品提交
亚历Punnen

47

我经常使用更改的别名。进行设置:

git config --global alias.changed 'show --pretty="format:" --name-only'

然后:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

可能有用的类似命令:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

40

采用

git log --name-status

这将向您显示提交ID,消息,更改的文件以及是否对其进行了修改,创建,添加或删除。多合一命令。


38

使用标准的git diff命令(也适用于脚本编写):

git diff --name-only <sha>^ <sha>

如果还需要更改文件的状态:

git diff --name-status <sha>^ <sha>

这与合并提交一起很好地工作。


26

尝试使用此命令获取名称并更改行数

git show --stat <commit-hash>

只显示文件名

git show --stat --name-only  <commit-hash>

获取最后的提交哈希,然后尝试此命令

git log -1

带有显示文件名和文件状态的最后提交修改,创建或删除

 git log -1 --oneline --name-status <commit-hash>

或全部

git log

有关更高级的git日志信息,请阅读本文

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare“致命的:无法识别的参数:仅--names”来自2.20.1.windows.1
user2864740


20

好的,有几种方法可以显示特定提交中的所有文件...

为了减少信息并仅显示已提交文件的名称,您只需添加--name-only--name-status标记...,这些标记就可以根据需要显示与先前提交不同的文件名...

因此,您可以执行以下操作,git diff其后紧跟--name-only两个提交哈希<sha0> <sha1>,如下所示:

git diff --name-only 5f12f15 kag9f02 

我还创建了下面的图像,以显示在这种情况下要经历的所有步骤:

git diff-仅名称5f12f15 kag9f02


为什么有两个裁判(您将其命名为哈希)?
哈克(

15

我用它来获取两个变更集之间的修改文件列表:

git diff --name-status <SHA1> <SHA2> | cut -f2

是的,但状态可以在很好很方便(对于isntance,你可能想用grep显示,除了那些已经被删除的东西,如所有文件git diff --name-status .. | grep ^[^D] | cut -f2
皮埃尔·阿德里安·比松


14

还有git whatchanged,它比git log

NAME
       git-whatchanged - Show logs with difference each commit introduces

它输出提交摘要,并在其下列出文件列表及其模式,以及是否添加(A),删除(D)或修改(M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

将给出类似的内容:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

我知道这个答案与“没有多余的信息”并不完全匹配,但是我仍然认为此列表比文件名更有用。


另外,仅提供一个命令即可whatchanged提供参数。
百利牛斯

11

我喜欢这个:

git diff --name-status <SHA1> <SHA1>^

我认为这会使AD(添加和删除)文件状态倒退,因为它显示的是从指定提交到上一个提交的差异,而不是相反。应该是git diff --name-status <SHA1>^ <SHA1>
Troy Gizzi 2015年

11

如果只想在上一次提交中更改文件列表,请使用简单的一行命令:

git diff HEAD~1 --name-only

8

列出提交中更改的文件:

git diff --name-only SHA1^ SHA1

这不会显示日志消息,多余的换行符或其他任何混乱的内容。这适用于任何提交,而不仅仅是当前提交。不知道为什么它没有相当尚未提及,所以我将它添加。


这两个看起来相同:git diff SHA1^ SHA1git show SHA1
弗拉基米尔·武卡纳克(Fladimir Vukanac)2016年

1
@mrW这些命令产生类似的输出,但git show也显示提交消息
Newtonx

8

显示日志。

COMMIT可以为空白(“”)或sha-1或sha-1缩短。

git log COMMIT -1 --name-only

这将仅列出文件,对于进一步处理非常有用。

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"


5

结合使用“ git show --stat”(感谢Ryan)和几个sed命令可以为您减少数据量:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

那将只产生修改后的文件列表。


5

有一个简单的技巧可以查看为文件列表,只需将其添加:在哈希之后即可。

git show 9d3a52c474:

然后,您可以深入了解

git show 9d3a52c474:someDir/someOtherDir

如果您打了一个文件,您将获得该文件的原始版本。如果您只是在寻找一个不错的参考或关键代码(差异可能会使所有事情变得一团糟),有时这就是您想要的,

git show 9d3a52c474:someDir/someOtherDir/somefile

此方法的唯一缺点是它不容易显示文件树。



2

我用它来获取合并提交中已更改文件的列表

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

要么

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

如果您使用的是oh-my-zsh和git插件,则glg快捷方式会很有帮助。


3
您只是...从答案中剪下所有代码吗?这根本不是我所指的。OP要求的结果输出中没有多余的信息,而不是您的答案!您仍然有一个答案,可以输出很多无关的信息。但是现在,它的描述不够准确。OP希望输出文件列表,仅此而已。看一下glg输出:更多。对困惑感到抱歉。
RomainValeri

0

文件列表(甚至没有提交消息):

git show --name-only --pretty=format:

例如,在编辑器中打开所有更改的文件:

"$EDITOR" $(git show --name-only --pretty=format:)

-2

我以为我会分享我的别名的摘要。.我也发现在git中很好地使用'zsh'和git色度键,一切都很好,并通过更改命令提示符告诉您希望分支始终存在。

对于那些来自SVN的文章,您会发现这很有用:(这是来自不同线程的想法的组合,我只知道知道如何使用复制/粘贴)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

-3

这应该工作:

git status

这将显示未暂存的内容和已暂存的内容。


7
问题是关于获取先前提交的文件列表,而不是即将提交的提交。
Rup
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.