Подтвердить что ты не робот

Git diff с фильтром автора

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

Меня интересует окончательный итоговый diff, а не различия отдельных коммитов.

Есть ли трюк git для этого?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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