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