2016-11-10 1 views
0

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

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

+2

См. 'Git log --grep', затем см. Параметр' --invert-grep'. – torek

+0

@torek Используется в 1000 раз непрямым путем gui, но не знал об этом tbh: D Спасибо! Можете ли вы добавить его в качестве ответа, чтобы я мог его принять? Я использую его так: 'git log release/XXXX^master --no-merges --invert-grep --grep = 'SHR-1234' --grep = 'SHR-4321' ...' – clinical

+0

Связано: https: //stackoverflow.com/q/1419623/1959808 –

ответ

1

git log command предлагает два интересных варианта здесь:

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

            Когда --show-notes в сущности, сообщение из нот соответствует, как будто это часть сообщения журнала.

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

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

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

+0

отлично, именно то, что мне нужно. Спасибо! – clinical

0

вы можете использовать -g 'регулярное выражение', чтобы удовлетворить ваши требования

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

+0

'-G' ищет выражение, которое будет отображаться в * патче * в качестве добавленной или удаленной строки, то есть это зависит на выходе 'git diff'. Существует также '-S', который ищет изменение * числа вхождений * строки (в отличие от' -G', это ищет фиксированную строку, а не регулярное выражение, если вы не добавляете больше флагов). Однако OP хочет выполнить поиск текста * commit message *. – torek

-1

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

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).

+0

Это вообще не помогает OP; Это не будет иначе, если он скажет «git log OTHER^master». Его проблема заключается в попытке определить некоторые коммиты с сообщениями, которых он не ожидает; это вообще не уменьшает или не устраняет проблему. По иронии судьбы проблема заключается в том, что вы сосредоточены на названии, а не на содержании вопроса. – UpAndAdam

+0

Действительно, это приводит к тем же различиям, что и 'git log --pretty = format:% s other^master'. Одно использование этого подхода состоит в том, чтобы увидеть сравнение того, где коммиты, которые не содержатся в обеих ветвях, расположены относительно других коммитов. –

+0

Вам не хватает точки ... в 'master' не будет никаких коммитов, которые не находятся в' other' здесь, в котором работает OP. 'other' опережает' master', когда он был «разветвлен» для его версии. Нет сравнения, просто список коммитов, которые находятся только на 'other', и OP хочет найти коммиты там, которые не должны быть там .... когда законченный OP будет сливаться обратно в' master' .. что опять-таки, почему нечего приказывать. Вы отвечаете на вопрос, который не спрашивали, почему бы не спросить и ответить на вопрос, который вы пытаетесь ответить; что, вероятно, будет полезно для других :) – UpAndAdam

Смежные вопросы