如何在两个git提交之间找到交集?

4

我希望找到在两个提交或两个差异中都被修改过的文件。如果这很简单,请原谅,因为我对git还很陌生。


为什么你需要这个?也许有更好的方法来解决你的问题。 - michas
1
我们有兴趣找出在一个大的提交中可能被遗漏的更改。 - Paul Becotte
2个回答

2

更新

在 @PaulHicks 的帮助下(使用 git diff 代替 git diff-tree ...谢谢 Paul)并为了避免出现描述在此处的错误,即在这里加入 | sort 命令,这是我更新后的答案:

comm -12 <(git diff --no-commit-id --name-only -r 3fe29472016343 | sort) <(git diff --no-commit-id --name-only -r 9fd796b1998bb7d5 | sort)

旧回答 我不认为有一个命令可以直接实现你想要的功能。然而,如果你在*nix平台上,可以尝试以下方法:

comm -12  <(git diff-tree --no-commit-id --name-only -r COMMIT1SHA1key) <(git diff-tree --no-commit-id --name-only -r COMMIT2SHA1key)

不幸的是,我正在使用 Windows 计算机 :( ,因此无法立即检查(我必须回家尝试)

我的想法是 git diff-tree 会生成类似于 这里 的文件列表。

而这个 链接 展示了如何在 ls 上运行 comm -12。

我的猜测是将两者结合起来可能有效。


1
我只是在 Stack Overflow 上偶然发现了这个...请查看我的回答中的链接。 - Vikram
@PaulHicks 谢谢你让我知道...不幸的是,我现在无法检查,因为我在使用 Windows 机器...我会回家试一下。 - Vikram
<(...) 是 Bash 的特性:运行括号中的命令并将其标准输出重定向到管道,将 <(...) 部分替换为 /dev/fd/ 引用管道描述符。这是一个方便的技巧,可以避免使用临时文件。 - torek
请注意,使用一个提交ID的git diff-tree命令会隐式地将树与提交的父级进行比较,并且对于合并提交会有不同的行为(生成组合差异)。 - torek
我没有问任何问题。我只是尝试了答案中的语法,但对于修改了一个文件的提交,我没有得到任何输出;而我的答案中的git diff方法给了我被更改的文件。这可能只是一个小的语法问题。 - Paul Hicks
啊,是的,我使用的 SHA-1 是合并版本。对于其他 SHA-1,diff-tree 运行良好。不过,差异比较方法在所有情况下都有效,这很方便。我想这取决于你想从命令中得到什么。 - Paul Hicks

1
您可以使用git diff --name-only sha1^ sha1获取单个提交中更改的文件列表。因此,您可以在接受两个提交SHA-1作为参数的脚本中执行此操作:
git diff --name-only $1^ $1 | sort > file1
git diff --name-only $2^ $2 | sort > file2
comm -12 file1 file2
rm file1 file2

如果你正在使用Linux/Unix上的bash,你可以使用来自@Vikram答案的巧妙技巧来避免临时文件:

comm -12 < (git diff --name-only $1^ $1) < (git diff --name-only $2^ $2)

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