git diff with author filter

64jmpszr  于 2023-06-28  发布在  Git
关注(0)|答案(3)|浏览(121)

我有一系列不同作者的提交,我希望在2次提交之间看到git dff输出,但只考虑其中一个作者的提交,类似于git log中的--author。
我感兴趣的是最终的总结差异,而不是单个提交的差异。
有什么饭桶的把戏吗?

8ehkhllq

8ehkhllq1#

这里的问题是,你不能在一般情况下这样做。假设Alice修改了一个特定的文件,然后Bob也修改了它--包括Alice修改过的部分--最后Alice再修改一次。如何将Alice的两个diff合并为一个diff?如果你把它们当作两个补丁,那么第二个补丁在没有Bob的补丁的情况下是不会应用的!但是您也不能简单地将最终状态与原始状态进行比较,因为这将包括Bob的更改。
如果你更喜欢使用git操作的例子,这就像做一个交互式的rebase,只是删除随机提交。当然,有时它会工作,但有时它会完全失败,因为其中一个提交依赖于您取出的一个提交。
所以,我知道你说过你不想要单独的提交差异,但这就是你真正希望的:

git log -p --author=Alice

或者,如果你真的非常需要一个单独的diff,这将为你提供它,但只有在没有补丁交互的情况下,就像我上面提到的那样:

git checkout -b temp first_commit
git log --reverse --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 --reverse --pretty=%H --author=Alice first_commit..second_commit)
git diff first_commit temp

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

e0uiprwp

e0uiprwp2#

您可以使用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.<<

然后你可以grep相关的作者。

8wigbo56

8wigbo563#

git log -p --author=bla|差分统计

相关问题