Вы можете использовать опцию --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
..., чтобы увидеть комбинированный патч.Я не рекомендую никому использовать этот скрипт, но я думаю, что это забавный и хакерский способ делать то, что вы хотите:)