40

我有不同作者的一系列提交,我希望看到git dff2 次提交之间的输出,但只考虑其中一位作者的提交,比如 git log 中的 --author 之类的东西。

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

有一个 git 技巧吗?

4

2 回答 2

32

这里的问题是在一般情况下你不能这样做。假设 Alice 改变了一个特定的文件,然后 Bob 改变了它——包括 Alice 改变的部分——最后 Alice 再次改变了它。你如何将 Alice 的两个差异组合成一个差异?如果你把它们当作两个补丁,那么如果没有先应用 Bob 的补丁,第二个就不会应用!但是您也不能简单地将最终状态与原始状态进行比较,因为这将包括 Bob 的更改。

如果您更喜欢 git 操作的示例,这就像进行交互式 rebase,并且只是删除随机提交。当然,有时它会起作用,但有时它会完全失败,因为其中一项提交取决于您取出的其中一项。

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

git log -p --author=Alice

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

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

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

于 2010-08-18T13:20:05.813 回答
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.<<

然后,您可以对相关作者进行 grep。

于 2010-08-18T06:25:09.237 回答