我希望找到在两个提交或两个差异中都被修改过的文件。如果这很简单,请原谅,因为我对git还很陌生。
我希望找到在两个提交或两个差异中都被修改过的文件。如果这很简单,请原谅,因为我对git还很陌生。
更新
在 @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。
我的猜测是将两者结合起来可能有效。
<(...)
是 Bash 的特性:运行括号中的命令并将其标准输出重定向到管道,将 <(...)
部分替换为 /dev/fd/
引用管道描述符。这是一个方便的技巧,可以避免使用临时文件。 - torekgit diff-tree
命令会隐式地将树与提交的父级进行比较,并且对于合并提交会有不同的行为(生成组合差异)。 - torekgit 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)