Проблема в том, что вы не можете сделать это в общем случае. Предположим, Алиса меняет определенный файл, затем Боб меняет его, включая части, которые Алиса изменила, и, наконец, Алиса меняет его снова. Как вы объединяете два сравнения Алисы в один? Если вы возьмете их за два патча, второй просто не будет применяться без первого патча Боба! Но вы также не можете просто отличить конечное состояние от исходного, потому что это будет включать изменения Боба.
Если вы предпочитаете пример с операциями git, это похоже на интерактивную перебазировку и просто удаление случайных коммитов. Конечно, иногда это будет работать, но иногда это будет просто неудачно, потому что один из этих коммитов зависел от одного из тех, что вы вынули.
Итак, я знаю, что вы сказали, что не хотите отдельных изменений коммитов, но это все, на что вы действительно можете надеяться:
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
Это действительно требует операций в рабочем дереве, потому что нет абсолютно никакой гарантии, что какой-либо из патчей будет применен после пропуска коммита. Вы просто должны попытаться увидеть.