Как сравнить две ветки 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, но результаты не полезны, потому что они не отфильтровывают весь коммит.
Ответы
Ответ 1
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
. Нет причин, по которым один из них предпочитает один за другим, - и завершаться, делая то же самое внутри, - так используйте то, что вы найдете более читаемым. )
Ответ 2
вы можете использовать -G 'регулярное выражение для удовлетворения вашего требования
git log release/X.X.X.X ^master--no-merges -G ‘regular expression’
(включить или исключить указанное commit)
Ответ 3
Название вопроса допускает несколько иной ответ, который может быть полезен некоторым людям. Простым способом сравнения двух ветвей с помощью фиксированного заголовка является сбрасывание заголовков фиксации из каждой ветки в отдельный текстовый файл и открытие этих двух файлов в средстве просмотра различий:
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
и откройте их в средстве просмотра визуальных различий meld (один из вариантов - kdiff3
).