获取特定Git提交的更改文件列表及其状态

10
我使用以下Git命令。
git diff-tree --no-commit-id --name-only -r <SHA>

获取更改文件列表。

不幸的是,该列表不指定每个文件的更改类型:添加、修改或删除等等。

如何显示给定SHA的特定提交中更改的列表[更改类型、文件名]。


如果您想获取任意两个提交之间的文件更改而不是特定提交的更改,则请参阅显示两个Git提交之间的所有更改文件。*(抱歉重新评论,之前的评论太多粗体字,看起来很糟糕,所以我把它们都删掉了)* - user456814
一位开发者在GitLab的pre-receive hook中使用了这个命令,以比较我们GitLab服务器上的代码(传递的<SHA>提交)与正在推送/接收的代码。只是想确认我们正在做正确的事情。看起来工作正常。 - Gobi Dasu
5个回答

21

使用--name-status代替--name-only

git diff-tree --no-commit-id --name-status -r <SHA>

这将显示文件名及其状态字母(提取自man手册):已添加(A),已复制(C),已删除(D),已修改(M),已重命名(R),类型已更改(即常规文件,符号链接,子模块等)(T),未合并(U),未知(X)或其配对已中断(B)。

8

虽然Joe的回答指出您可以在git diff-tree中使用--name-status标志,但您也可以改用相同的标志来代替git diff

要获取某个特定提交的更改文件及其状态,只需使用该提交的sha id和提交父级说明符即可,如下所示:

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

修订说明符<sha>^表示提交<sha>的第一个父提交,因此在使用git diff时,使用该说明符可以有效地获取提交与其父提交之间所做的所有更改。

替代方法

您也可以使用

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

“<sha>~”也表示提交“<sha>”的父提交。

文档


那也很好,不幸的是不能将多个答案标记为正确答案。已标记并且是正确的解决方案,谢谢。 - Ashraf Bashir

4
使用
git whatchanged 

查看最近一次提交


这将输出所有提交的更改,而不仅限于传递的提交 SHA。 - Ashraf Bashir
我正在尝试解决的问题是针对特定提交。 - Ashraf Bashir
你的原始答案包括 git whatchanged SHA-1 的形式,几乎正确:添加 -1 选项以仅获取该特定提交。 - user743382
这就是我正在寻找的。但快速查看 man-page 显示,新的 equal 命令是 git log --raw - Samha'

1
git checkout <commit>
git whatchanged -1

1

感谢hvd的评论stdcall的回答,

你原来的回答,包括git whatchanged SHA-1形式,几乎是正确的:添加-1选项只获取特定提交。

这是对那些感兴趣的人的解决方案:

git whatchanged <SHA> -1

另一个解决方案是:

git diff-tree --no-commit-id -r <SHA>

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