git:显示两次提交之间更改的所有文件


Answers:


79

这是我能想到的最好的方法:

git log --name-only --pretty=oneline --full-index HEAD^^..HEAD | grep -vE '^[0-9a-f]{40} ' | sort | uniq

用要比较的提交替换HEAD ^^和HEAD。

我的尝试使用git logwith--name-only列出指定提交之间每次提交的所有文件。--pretty=oneline使文件列表上方的部分仅包含提交SHA和消息标题。--full-index使SHA成为完整的40个字符。grep过滤掉任何看起来像SHA的内容,后跟一个空格。除非您的文件以SHA开头,后跟一个空格,否则结果应该是准确的。


当我对HEAD ^和HEAD运行该命令时,我得到一个清单,看起来像存储库中的每个文件。甚至那些没有改变的。
布莱尔·霍洛威

我不好,格式是“ <commit1> .. <commit2>”,而不是“ <commit1> <commit2>”。
igorw 2010年

谢谢,有点尴尬,但是可以。
安德鲁

2
绝对尴尬。我必须在提交SHA之间放置3个点(而不是如图所示的2个)才能使其正常工作。我认为Bryce的答案比较简单(即在git diff命令上使用--stat),并且它提供了更多信息(更改的文件总数加上每个文件中更改的行数的摘要)。
丹尼尔·戈德法布

60

我认为此命令是您的答案:

git diff --stat abc123 xyz123  # where abc123 and xyz123 are SHA1 hashes of commit objects

直接来自git社区书

如果您不想看到整个补丁,可以添加“ --stat”选项,该选项将输出限制为已更改的文件,以及一个小的文本图,该图描述了每个文件中更改了多少行。


4
更具体地说,git diff --stat <commit1> <commit2>
布莱尔·霍洛威

4
不,这完全不是他想要的。Git diff在树之间进行直接差异,它不考虑提交。如果创建内容为“ A”的新文件,然后将内容更改为“ B”,然后将其更改回“ A”,git diff --stat HEAD^^ HEAD将为您提供空白输出。
igorw 2010年

3
git diff --name-only可能比更好,git diff --stat但正如指出的那样git diff,OP并没有做到。
nnutter 2014年

14

如果仅想查看b按时间顺序在其后提交的文件名a

git diff <a commit sha1>...<b commit sha2> --name-only # b is after a in time

如果要查看所有文件名以及从提交a到提交b的更改,请删除最后一个参数。

git diff <a commit sha1>...<b commit sha2> # shows file names and what changed in each file

<commit sha1>提交ID的一个示例是like 675ee6860d2c273bcc6c6a0536634a107e2a3d9f。通常,前8到10位数字可用于大多数项目,但如果项目有很多提交,则可能需要更多。通常,我使用id的输出git log --oneline

当您得到a ... b的差异,并且b在时间上晚于a时,很容易按时间顺序查看每个文件中的更改。


1

这类似于igorw的,但是它避免了通过grep以下方式删除SHA :

git log --pretty='format:' --name-only HEAD^^..HEAD | sort -u

如果您还想查看文件的修改方式,请替换--name-only--name-status


我刚刚测试了此命令。处理大约花了10秒钟,然后开始生成庞大的文件列表。
ostler.c 2012年

@ ostler.c:您是否在中输入了修订范围"$@"?否则,它将显示现有的更改,这是很多的:-)我已经修改了答案以使用示例,就像其他答案一样。
Ingo Karkat 2012年

好吧,那很有道理。令我惊讶的是,我不知道“ $ @”。虽然,我发现它对大多数命令不是很有用。
ostler.c 2012年

@ ostler.c:我在git-showfiles脚本中有这一行,并"$@"插入所有传递的参数;尽管有点晦涩(就像在shell脚本中一样),但这是非常标准的东西。
Ingo Karkat,2012年

0

我会用 接受提交哈希的前8个。如果您愿意,可以按照以下说明将文件放入文件中:

git log 12345678..87654321 > C:\GitChanges.txt

0

我使用此命令比较两次提交之间的所有更改:

git difftool -d <commit hash1> <commit hash2>

就像git rebase一样,将所有本地提交压缩为一个。

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.