Как сравнить две ветки 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
).