git diff с авторским фильтром - PullRequest
31 голосов
/ 18 августа 2010

У меня есть серия коммитов разных авторов, и я хотел бы видеть вывод git dff между 2 коммитами, но только с учетом коммитов одного из авторов, что-то вроде, - что-то вроде --author в git log.

Я заинтересован в итоговой разнице, а не различий отдельных коммитов.

Есть ли для этого мерзавец?

Ответы [ 2 ]

26 голосов
/ 18 августа 2010

Проблема в том, что вы не можете сделать это в общем случае. Предположим, Алиса меняет определенный файл, затем Боб меняет его, включая части, которые Алиса изменила, и, наконец, Алиса меняет его снова. Как вы объединяете два сравнения Алисы в один? Если вы возьмете их за два патча, второй просто не будет применяться без первого патча Боба! Но вы также не можете просто отличить конечное состояние от исходного, потому что это будет включать изменения Боба.

Если вы предпочитаете пример с операциями 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

Это действительно требует операций в рабочем дереве, потому что нет абсолютно никакой гарантии, что какой-либо из патчей будет применен после пропуска коммита. Вы просто должны попытаться увидеть.

1 голос
/ 18 августа 2010

Возможно, вы можете использовать функции форматирования 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.<<

Затем вы можете найти соответствующего автора.

...