Список всех коммитов между 2 коммитами - PullRequest
0 голосов
/ 04 марта 2019

Я планирую новый процесс развертывания в нашей команде.

Для каждой сборки X у нас есть $ last_commit_from_last_build X-1 и $ last_commit насуществующая сборка X.

Мы не выполняем сборки параллельно, это означает, что в сборке X может быть более одного коммита, поэтому нам нужно перечислить эти коммиты, чтобы мы их не пропустили.Например, это может быть порядок коммитов от самого старого до самого нового:

( last_commit_from_last_build ) (сборка X-1), ( some_commit_1 , some_commit_2 , last_commit ) (сборка X)

В сборке X нам нужно построить все коммиты между $ last_commit_from_last_build и $ last_commit. Нам нужны только коммиты между $ last_commit_from_last_build и $ last_commit.

Итак, мы решили использовать: git log $last_commit_from_last_build...$last_commit.

Дело в том, что он показывает странные результаты,если у нас есть следующая история на GitHub:

first image

Когда мы запускаем git log 3ec29f0...573e22e

Мы получаем следующие результаты:

second image

Коммиты bdd и e57 находятся между этими коммитами.

637 нет!

Что может пойти не так в нашей логике, и есть ли лучший способ получить этот запрошенный список?Это приводит к неправильной сборке и не позволяет нам продолжать наш проект.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Как и OP, я также заметил, что порядок, выбранный GitHub для отображения коммитов, не настолько «надежен» или, по крайней мере, не связан напрямую с основным отношением графа, так как кажется, что выбранный порядок зависит отвременные метки коммитов (которые на самом деле могут быть изменены при использовании таких команд, как git rebase -i …).

Так что подход на основе CLI, объясненный в ответе @ torek, определенно является подходящим способом.

В противном случае вы также можете использовать графические команды, такие как gitk --all, для отображения графика фиксации и лучшего понимания связи между коммитами, ветвями и тегами в данном репозитории.

Для получения более подробной информации см., Например, этот урок Используйте gitk для понимания git , который содержит закомментированные скриншоты gitk.

0 голосов
/ 05 марта 2019

Сначала идите к Думайте, как (а) Git .Прочитайте все это или, по крайней мере, на странице под названием «Экспериментирование с Git», и продолжайте работать с ней, пока не поймете понятие достижимость и то, как Git использует ссылки .

Теперь вы знаете все, что вам нужно знать, чтобы понять синтаксис с двумя и тремя точками, которые предлагает командная строка Git:

A...B

- это набор коммитов, достижимый из либо name-или-хэш-ID A или name-or-hash-ID B, но не из обоих имен.Между тем:

A..B

- это набор коммитов, достижимых с B, исключая набор коммитов, достижимых с A. Это, вероятно, но не обязательно, то, что вы хотите.

Когда commit A является предком commit B, вы можете захотеть установить другой набор, нежели любой из них.В частности, вам может потребоваться набор всех коммитов, начиная с A, которые являются потомками A и предками B.Универсального синтаксиса для этого не существует, но он доступен через git rev-list (и, следовательно, через git log) как:

git rev-list --ancestry-path A..B

Обратите внимание, что здесь пропускается A, но он включает B, каквариант A..B без --ancestry-path.(Вы можете добавить --boundary, чтобы включить A здесь, но остерегайтесь некоторых странных побочных эффектов от --boundary в более общих случаях.)

Вариант с --ancestry-path - это то, что вам нужно, если простоA..B это не то, что вы хотите.Между этими двумя вариациями обычно отражается несколько скользкое понятие «между» в ориентированном ациклическом графе.

...