Как сравнить две ветки git и отфильтровать различия по сообщению фиксации?

У меня есть ветка релиза с именем release/X.X.X.X который содержит все ветви функций, которые я хочу развернуть в производство. Релиз ветки сделан поверх master который является текущим состоянием производства.

В каждый день релиза я проверяю, чтобы наша ветка релиза содержала только те изменения, которые запланированы для релиза. Я использую эту команду для сравнения выпуска и основной ветки: git log release/X.X.X.X ^master --no-merges, Затем я вручную проверяю коммиты по ключевым словам типа "SHR-1234", которые представляют номера билетов в нашей системе управления билетами. Мне нужно сравнить каждый коммит со списком номеров билетов, чтобы определить нежелательные изменения.

Как я могу фильтровать коммиты, которые возвращаются git log release/X.X.X.X ^master --no-merges и не содержат такие ключевые слова, как "SHR-1234"? Таким образом, я могу определить номер билета нежелательных изменений.

Я пробовал grep и awk, но результаты бесполезны, потому что они не отфильтровывают весь коммит.

3 ответа

Решение

git log Команда предоставляет два интересных варианта:

--grep=<pattern>
Ограничьте вывод коммитов сообщениями с лог-сообщением, соответствующим заданному шаблону (регулярное выражение). С более чем одним --grep=<pattern>, фиксирует, чье сообщение соответствует любому из заданных шаблонов (но см. --all-match).

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

следовательно --grep позволяет вам найти коммиты, которые содержат какую-то конкретную строку или шаблон. Вы хотите коммиты, которые не содержат (ни одной, ни всех) строк, поэтому мы перейдем к:

--invert-grep
Ограничьте вывод коммитов сообщениями, которые не соответствуют шаблону, указанному в --grep=<pattern>,

(Кстати, обратите внимание, что release/X.X.X.X ^master также может быть написано master..release/X.X.X.X, Нет никакой причины на уровне машины отдавать предпочтение одному над другим - оба вынуждены делать одно и то же внутри, поэтому используйте то, что вам удобнее.)

Вы можете использовать –G "регулярное выражение", чтобы удовлетворить ваши требования

git log release/X.X.X.X ^master--no-merges -G ‘regular expression’ (включить или исключить указанный коммит)

В названии вопроса допускается несколько иной ответ, который может быть полезен для некоторых людей. Простой способ сравнить две ветви только по заголовку фиксации - выгрузить заголовки фиксации из каждой ветви в отдельный текстовый файл и открыть эти два файла в программе просмотра diff:

git --no-pager log --pretty=format:%s master > log_master.txt
git --no-pager log --pretty=format:%s other > log_other.txt
meld log_master.txt log_other.txt

Мы сначала дамп фиксируем темы из ветки master в файл log_master.txt, а затем совершать предметы из филиала other в файл log_other.txt и откройте их в поле визуального просмотра различий kdiff3).

Другие вопросы по тегам