git diff与作者过滤器

时间:2010-08-18 06:15:51

标签: git git-diff

我有不同作者的一系列提交,我希望在2个提交之间看到git dff输出,但只考虑其中一个作者的提交,比如像git log中的--author

我对最终的摘要差异感兴趣,而不是对各个提交的差异感兴趣。

是否有一个git技巧?

2 个答案:

答案 0 :(得分:26)

这里的问题是在一般情况下你不能这样做。假设Alice更改了特定文件,然后Bob更改了它 - 包括Alice更改的部分 - 最后Alice再次更改它。你如何将Alice的两个差异组合成一个差异?如果你把它们当作两个补丁,那么第二个补丁根本不适用而不首先应用Bob的补丁!但是你也不能简单地将最终状态与原始状态区分开来,因为这将包括鲍勃的变化。

如果你更喜欢使用git操作的例子,这就像做一个交互式rebase,只是删除随机提交。当然,有时它会起作用,但有时候它会完全失败,因为其中一个提交取决于你取出的那些之一。

所以,我知道你说你不想要个人提交差异,但这是你真正希望的:

git log -p --author=Alice

或者,如果你真的非常渴望一个单独的差异,这将为你提供,但只有在没有像我上面提到的补丁交互的情况下:

git checkout -b temp first_commit
git log --pretty=%H --author=Alice first_commit..second_commit |
while read commit; do
    git cherry-pick $commit || exit
done
# or if you have a new version of git, cherry-pick works with multiple arguments:
# git cherry-pick $(git log --pretty=%H --author=Alice first_commit..second_commit)
git diff first_commit temp

这确实需要工作树中的操作,因为绝对不能保证一旦跳过提交就会应用任何补丁。你只需要试试看。

答案 1 :(得分:1)

可能您可以使用diff-tree

的格式设置功能
format:<string>
  

format:<string>格式允许您指定要显示的信息   它的工作方式有点像printf格式,但值得注意的是,您使用%n代替\n获取换行符。

     

,例如,

format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 
  

将显示如下内容:

The author of fe6e0ee was Junio C Hamano, 23 hours ago
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

然后你可以向相关作者致意。