2014-02-25 52 views
4

也就是说,我有兴趣找到两个提交都被修改的文件(或者如果更容易的话,在两个差异中)。不好意思,如果这很简单,但我对git仍然很陌生。如何找到两个git提交之间的交集?

+0

为什么你需要这个?也许有更好的方法来解决你的问题。 – michas

+1

我们有兴趣找到可能在大型提交中丢失的更改。 –

回答

2

更新

后从@PaulHicks输入(git diff而不是git diff-tree ...感谢保罗)和规避错误描述here| 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) 

不幸的是,我从窗口中键入:(..hence不能检查忙啥(我要回家试试)

这里我的想法是git的差异树会产生一个文件列表像here

link显示此COMM -12作品上ls

编织既有可能是如何工作的是我的猜想

+1

我真的刚刚遇到这堆栈溢出...看到这些链接在我的回答 – Vikram

+0

@PaulHicks谢谢你让我知道...我不幸现在不能检查这个,因为我在一台Windows机器...我会去home and try out – Vikram

+0

'<(...)'是一个bash-ism:运行带标准输出的括号命令到管道,用'/ dev/fd替换'<(...)'部分/'引用管道描述符。这是避免临时文件的方便技巧。 – torek

1

您可以使用git diff --name-only sha1^ sha1获取单个提交中更改的文件列表。

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中,你可以从@维克拉姆的回答,避免使用漂亮的绝招:所以,你可以在脚本中它有两个提交SHA-1作为参数做到这一点临时文件:

comm -12 < (git diff --name-only $1^ $1) < (git diff --name-only $2^ $2) 
相关问题