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
3条答案
按热度按时间8ehkhllq1#
这里的问题是,你不能在一般情况下这样做。假设Alice修改了一个特定的文件,然后Bob也修改了它--包括Alice修改过的部分--最后Alice再修改一次。如何将Alice的两个diff合并为一个diff?如果你把它们当作两个补丁,那么第二个补丁在没有Bob的补丁的情况下是不会应用的!但是您也不能简单地将最终状态与原始状态进行比较,因为这将包括Bob的更改。
如果你更喜欢使用git操作的例子,这就像做一个交互式的rebase,只是删除随机提交。当然,有时它会工作,但有时它会完全失败,因为其中一个提交依赖于您取出的一个提交。
所以,我知道你说过你不想要单独的提交差异,但这就是你真正希望的:
或者,如果你真的非常需要一个单独的diff,这将为你提供它,但只有在没有补丁交互的情况下,就像我上面提到的那样:
这确实需要工作树中的操作,因为一旦跳过提交,就绝对不能保证任何补丁都会应用。你只需要试着去看。
e0uiprwp2#
您可以使用diff-tree的格式化功能。
format:<string>
允许您指定要显示的信息。它的工作原理有点像
printf
,但值得注意的是,您会得到一个带有%n
而不是\n
的换行符。例如,
会显示这样的内容:
然后你可以grep相关的作者。
8wigbo563#
git log -p --author=bla|差分统计