Как мне получить список всех git коммитов в объединенной ветке? - PullRequest
4 голосов
/ 05 мая 2020

У меня проблема, очень похожая на эту , но я не могу понять, как применить решение в моем случае, потому что мой случай немного сложнее.

Учитывая следующую историю:

X0 - X1 - - X - X - Xn - ... - Xinf
 \         /   /   /
  \   C - D   /   /
   \ /     \ /   /
    A - E - F - H
     \ /     \ /
      B       G

master указывает на Xinf, а release указывает на H.

После того, как ветвь release была создана из master, сделано куча исправлений. Некоторые из них были объединены только в release (например, B и G), некоторые из них были объединены в release и master (например, C-D). Ветвь release также несколько раз объединялась с master. В этом примере я убедился, что все это произошло, но на самом деле они могли произойти больше (или меньше) раз, чем указано в моем примере. 1027 * refs, как мне получить список всех коммитов в ветке release, то есть от A до H?

Я создал образец репо с историей, описанной выше , чтобы это было легче проверить.

1 Ответ

2 голосов
/ 03 июня 2020

Один из способов нацелить X0:

  • это ближайший предок, который находится как в цепочке первых родителей от мастера , так и в цепочке первых родителей из release

Я не знаю, как это сделать в одном go с одним git rev-list или git log, но вот способ получить его через скрипт:

# get the list of first-parents of master, store this list in a file :
$ git rev-list --first-parent master > /tmp/tmp-rev-list

# get the list for release, and grep it using 'tmp-rev-list'
# commits will be listed in topo order, 'X0' is the first one :
$ git rev-list --first-parent release | grep -f /tmp/tmp-rev-list | head -1

Вы можете ускорить grep, используя -F (что означает: все шаблоны - тупые строки, без регулярного выражения),
, и вы можете пропустить tmp-файл, используя <( ... ):

$ X0=$( git rev-list --first-parent release |\
    grep -Ff <(git rev-list --first-parent master) |\
    head -1 )

# obviously : it would be better to write this command in a script,
# and then use it to get X0:   X0=$(bash myscript.sh)

Получив этот идентификатор фиксации, вы можете просто запустить:

$ git log $X0..release
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...