【发布时间】:2010-08-18 06:15:51
【问题描述】:
我有不同作者的一系列提交,我希望在 2 次提交之间看到 git dff 输出,但只考虑其中一位作者的提交,例如 git log 中的 --author。
我对最终摘要差异感兴趣,而不是单个提交的差异。
有 git 技巧吗?
【问题讨论】:
-
这并不完全是重复的,但您可以在这里找到一些有用的信息:Extract relevant changes for code review
我有不同作者的一系列提交,我希望在 2 次提交之间看到 git dff 输出,但只考虑其中一位作者的提交,例如 git log 中的 --author。
我对最终摘要差异感兴趣,而不是单个提交的差异。
有 git 技巧吗?
【问题讨论】:
这里的问题是在一般情况下您不能这样做。假设 Alice 改变了一个特定的文件,然后 Bob 改变了它——包括 Alice 改变的部分——最后 Alice 再次改变了它。你如何将 Alice 的两个差异组合成一个差异?如果你把它们当作两个补丁,那么如果没有先应用 Bob 的补丁,第二个就不会应用!但是您也不能简单地将最终状态与原始状态进行比较,因为这将包括 Bob 的更改。
如果您更喜欢 git 操作的示例,这就像进行交互式变基,并且只是删除随机提交。当然,有时它会起作用,但有时它会完全失败,因为其中一项提交取决于您取出的一项。
所以,我知道你说过你不想要单独的提交差异,但这就是你真正希望的:
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
这确实需要在工作树中进行操作,因为绝对不能保证一旦跳过提交,任何补丁都会应用。你只需要试试看。
【讨论】:
也许你可以使用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。
【讨论】: