просмотр различий, вызванных набором коммитов - PullRequest
3 голосов
/ 23 октября 2011

Я хочу просмотреть различие только двух коммитов.

Например

$ git log --oneline
0ff4567 fix bug #1, now really really really
1ff4567 fix bug #1 really
2ff4567 fix bug #2
3ff4567 fix bug #3
4234567 refactor code
5ff4567 fix bug #1
6234567 fix bug #4

Я хочу просмотреть только коммиты, относящиеся к ошибке # 1, то есть коммиты 0ff4567, 1ff4567, 5ff4567.

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

Есть ли простой способ сделать это?

Обновление: Я знаю список соответствующих коммитов. Учитывая этот список, я хочу получить один разност, который легче рассмотреть.

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Вы можете использовать опцию --grep для git log, которая выводит только фиксации с сообщениями журнала, которые соответствуют определенному регулярному выражению.В вашем случае вы можете сделать:

git log --oneline --grep='bug #1'

... если вы хотите увидеть патчи, введенные каждым из этих коммитов, конечно, вы должны сделать:

git log -p --grep='bug #1'

В комментариях ниже вы объясняете, что вам действительно нужен один патч в качестве вывода, который представляет совокупный эффект патчей, представленных этими тремя коммитами.В этом случае вы можете попробовать одно из следующих действий:

  • Использование инструмента combinediff из patchutils для объединения различий.(Это может не работать, в зависимости от того, что изменились промежуточные коммиты.)
  • Создайте временную новую ветвь и используйте интерактивное перебазирование (возможно, с помощью хитроумной команды в переменной окружения GIT_EDITOR), чтобы изменить порядок ираздавить коммиты.

Чтобы немного расширить последний вариант, этот сценарий основан на примере ("super-kludgy") от Jefromi:

#!/bin/sh

set -e

if [ $# -ne 2 ]
then
    echo "Usage: $0 REGEX TEMPORARY_BRANCH_NAME"
    exit 1
fi

REGEX="$1"
BRANCH_NAME="$2"

git checkout -b "$BRANCH_NAME"

FIRST_COMMIT=$(git log --grep="$REGEX" --pretty=format:%H | tail -1)
if [ -z "$FIRST_COMMIT" ]
then
    echo "No commits matched '$REGEX'"
    exit 2
fi

export GIT_EDITOR="f() { if [ \"\$(basename \$1)\" = \"git-rebase-todo\" ]; then sed -i -n '/${REGEX}/p' \$1 && sed -i '2,\$s/pick/squash/' \$1; else vim $1; fi }; f"
git rebase -i ${FIRST_COMMIT}^

... которую вы можете вызвать как:

squash-matching-commits 'bug #1' tmp-branch

..., которая затем создаст ветку tmp-branch, перебазировав ее к родителюпервый коммит, который соответствует bug #1, выбирает только коммиты, которые соответствуют bug #1 и раздавляет все, кроме первого.(Возможно, вам придется исправить некоторые конфликты и предоставить сообщение фиксации для сдавленных коммитов.) Если это удастся, вы можете просто сделать:

git show

..., чтобы увидеть комбинированный патч.Я не рекомендую никому использовать этот скрипт, но я думаю, что это забавный и хакерский способ делать то, что вы хотите:)

1 голос
/ 23 октября 2011

Вы можете использовать git log --grep=fix1 (как показано в Ссылка на Git ), чтобы изолировать соответствующий коммит, а затем выполнить git show <commit> для каждого коммита.

См. " Сокращение для diff из git commit с его родителем?".

Объединение этих патчей в один diff не тривиально, как объясняет Jefromi в" gitdiff с авторским фильтром".

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

В вашем случае возможное (довольно громоздкое) решение должно быть аналогичнымк " Извлечь гзначительные изменения для проверки кода":

Проверьте рабочую копию в редакции перед первыми изменениями.Затем объедините все связанные коммиты в вашу рабочую копию.
Теперь у вас есть рабочая копия, которая отличается от своей базы только соответствующими изменениями.Вы можете просмотреть это напрямую или создать из него патч для просмотра.

Итак: выделенная ветвь fix1_review возможна, но это остается полуавтоматической настройкой (так как вы должны решить возможную)конфликты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...