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

3544

如何打印给定提交中包含的所有文件的普通列表?

尽管以下列出了文件,但它也包括每个文件的不必要的差异信息:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

58
我来到这里是想找一些不同的东西。我想看一下一组提交所修改的所有文件,然后使用了git log --until 2013-05-21 --pretty="short" --name-only命令取得了良好的效果。 - lmat - Reinstate Monica
8
使用此命令获取自前 n 次提交以来与 master 分支的所有更改:git diff-tree --name-status -r @{3} master - ako
5
git diff --name-only master - 列出当前分支与主分支(master)的所有修改文件名称。 - Noam Manos
1
你可以查看这个答案:https://dev59.com/S2Mm5IYBdhLWcg3wfvLd#68474286 - Pepe Alvarez
30个回答

4746

首选方法(因为它是一个管道命令,旨在以编程方式实现):

$ git diff-tree --no-commit-id --name-only bd61ad98 -r
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 参数只显示受影响的文件名(感谢Hank)。如果想要查看每个文件发生了什么(删除,修改,添加),请使用 --name-status 参数。
  • -r 参数用于递归进入子树。

47
需要注意的是,当查看根提交时,“diff-tree”无法工作。 - jbranchaud
382
--name-status选项替换--name-only可以提供更清晰的摘要。 - Kurt Zhong
37
如果您希望在根提交上运行它,请使用--root标志。根据手册:“当指定--root时,初始提交将显示为一个大的创建事件。这相当于针对NULL树的差异。” - Chris
31
最后一次提交可以通过以下命令获取:git log --name-only -n 1 HEAD~1..HEAD,该命令将显示最近一次提交的修改文件列表。请注意,这是对原始命令 git log --name-only -n 1 <hash> 的翻译而不是解释。 - Kurt
24
如果有人想知道(就像我一样),为什么第一种方式“更受青睐”,这要归功于@drizzt的评论;git show是“瓷器”(面向用户),而git diff-tree是“管道”(旨在以编程方式使用,例如从脚本中)。前者的界面可能随着时间的推移而发生变化(因此Git维护者可能会放弃--name-only,尽管我不认为他们会这样做)出于可用性的原因,而后者的界面将尽可能保持稳定,以保持兼容性。 - killscreen
显示剩余27条评论

350

如果你想获取更改过的文件列表:

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

如果你想获取一个提交中所有文件的列表,你可以使用

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

1
ls-tree 带 --name-only 在 1.6.4.4 或 1.6.3.3 上似乎无法正常工作。您认为这是一个 bug 吗? - krosenvold
2
原来这里参数的顺序很重要。你帖子中的那个不起作用,而你回复中的那个确实起作用 - 至少在你更新帖子之前是这样的 ;) - krosenvold
5
为避免打印SHA1,可以添加--no-commit-id参数,操作如下:git diff-tree --no-commit-id --name-only -r <commit-ish>。该命令用于显示指定提交(commit)与其父提交之间的差异,并只显示发生更改的文件名。 - John Mellor
1
diff-tree 没有返回任何内容,可能是因为我所引用的提交添加了文件,但没有更改任何现有文件。ls-tree 给我列出了仓库中所有文件的列表,而不仅仅是最后一次提交中添加/修改的文件。我想知道是否有第三个命令只列出所有文件(即在给定提交中添加的文件)? - CodeManX
4
你漏掉了添加 -r / -t 选项了吗?因为 diff-tree 可以处理修改和新增的文件。如果你想要列出所有新的(新增的)文件,可以使用 git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish> - Jakub Narębski
显示剩余10条评论

313

我假设您不想使用gitk,如果是这种情况,请尝试使用git show --name-only <sha>命令。


43
在我需要的大多数情况下,“--name-only”已经足够了;因此,我投票支持最短的解决方案(也是我只需尝试一次就能记住的唯一解决方案)。 - Erik S
1
作为一个喜欢命令行界面的Git用户,gitk是一种不错的方式来审查文件并显示差异所在的文件。例如:从同事那里进行代码审查时,可以针对一个巨型提交进行查看。 - Elijah Lynn

274

我个人使用--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

2
非常好。定义别名的方法是:alias gits='git show --stat --oneline',然后只输入 gits 就可以显示最新的更改(在 HEAD 中),而 gits b24f5fb 可以用来显示任何修订版本的更改。 - Brent Faust
5
可以创建一个Git别名...例如:git config --global alias.changes 'show --stat --oneline'。然后你就可以输入 git changes(可选commit-ish参数),从第一个示例中获得输出结果。 - lindes
Git for Windows需要使用双引号:git config --global alias.changes "show --stat --oneline" - Alchemistmatt
3
好的。与被接受的答案不同, git show 命令也可用于查看存储的更改:例如,使用命令 git show --stat --oneline stash@{1} - Jeff Ward
1
这正是我所需要的!与“git diff-tree --name-status -r <commit_id>”不同,使用此命令,我可以查看合并中受影响的文件!谢谢! - dobrivoje

132

您也可以进行

git log --name-only

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

输入 q 返回提示符。


3
谢谢,这很有帮助。顺便说一下:使用 git show 5944ad2a8b5 --name-only 来列出特定提交的名称。 - LiuWenbin_NO.
与省略“--name-only”相比有什么区别?换句话说,它的作用是什么,如何回答这个问题? - Peter Mortensen
简短易记,不错。 - Pranjal Sahu

76

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

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

正如Ethan所指出的:

git diff --name-only START_COMMIT..END_COMMIT

使用--name-status选项还会在每个文件旁边显示更改(添加、修改、删除等):

git diff --name-status START_COMMIT..END_COMMIT

5
如果您使用git diff --name-status START_COMMIT..END_COMMIT,那么您不需要后面的|sort | uniq - Ethan
1
以上评论有误,正确命令为:git diff --name-only START_COMMIT..END_COMMIT - Ethan
这正是我一直在寻找的。我是这样使用它的:git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'。我想要一个代码变更列表,仅针对一个包含数千个PNG和XML布局的巨大PR。 - AutonomousApps

73

最简单的形式:

git show --stat (哈希值)

这更容易记住,并且可以给您所需的所有信息。

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

git show --stat --name-only (哈希值)


2
“--name-only” 选项仍将包括一些标题行,其中包含作者、日期和提交消息等信息。 - devoured elysium

53

我经常使用修改过的别名。设置方法如下:

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

“changed” 有什么特别之处吗?它是一个任意选择的单词吗?一种约定俗成的规范吗?还是内置的东西? - Peter Mortensen

51

使用

git log --name-status

这条命令将显示提交ID、提交信息、更改的文件以及它们是修改、创建、添加还是删除。有点像一个多合一命令。


这会带出一个巨大的最近提交清单,我必须按住回车键才能看到所有内容,然后它会锁住我的命令行。不用了。 - john k

48

尝试使用这个命令以获取名称并更改行数

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 log信息,请阅读以下文章:


2
@DanFare 在2.20.1.windows.1版本中出现“fatal: unrecognized argument: --names-only”错误。 - user2864740
“for all”...仅使用git log无法提供文件名... - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接