Git Log A ..B (две точки)
Хотя этот синтаксис выглядит как "диапазон" коммитов от A до B, на самом деле это короткий путь для git log ^A B
:
- показать все коммиты, доступные из B; Сам B включен
- исключая те, которые достижимы из A; А само по себе исключено
Итак, учитывая следующую историю (самые старые коммиты слева, самые новые справа):
*--*--*--A--*--*--*--B
git log A..B
покажет все коммиты справа от A.
Обратите внимание, что git log A..
эквивалентен git log A..HEAD
.
git log A ...B (три точки)
Страница руководства git-rev-list описывает это как специальную запись для "симметричной разности".
Это эквивалентно git log A B --not $(git merge-base --all A B)
.
На простом английском языке это означает «все коммиты, которые доступны из A или B, но не из обоих.
Двойная точка
Наиболее распространенная спецификация диапазона - это синтаксис с двумя точками. Это в основном просит Git разрешить диапазон коммитов, которые достижимы из одного коммита, но недоступны из другого. Например, скажем, у вас есть история коммитов, которая выглядит следующим образом:
Вы хотите увидеть, что находится в вашей ветке эксперимента, которая еще не была объединена с вашей основной веткой. Вы можете попросить Git показать вам журнал только тех коммитов с master..experiment - это означает, что «все коммиты достижимы экспериментом, но не достижимы master». Для краткости и ясности в этих примерах я буду использовать буквы объектов фиксации на диаграмме вместо фактического вывода журнала в том порядке, в котором они будут отображаться:
$ git log master..experiment
D
C
Если, с другой стороны, вы хотите увидеть обратное - все коммиты в master, которые не находятся в эксперименте - вы можете поменять имена веток.
Эксперимент ... Мастер показывает вам все в мастер не достижимо из эксперимента:
$ git log experiment..master
F
E
Это полезно, если вы хотите постоянно обновлять ветку эксперимента и просматривать, что вы собираетесь объединить. Другое очень частое использование этого синтаксиса - посмотреть, что вы собираетесь передать на удаленный компьютер:
$ git log origin/master..HEAD
Эта команда показывает вам любые коммиты в вашей текущей ветке, которых нет в основной ветке вашего удаленного источника. Если вы запустили git push, а ваша текущая ветвь отслеживает origin/master, то коммиты перечислены в git log origin/master.HEAD - это коммиты, которые будут переданы на сервер. Вы также можете оставить одну сторону синтаксиса, чтобы Git принял HEAD. Например, вы можете получить те же результаты, что и в предыдущем примере, набрав git log origin/master. - Git заменяет HEAD, если одна сторона отсутствует.
Несколько очков
Синтаксис с двумя точками полезен как сокращение; но, возможно, вы хотите указать более двух ветвей, чтобы указать вашу ревизию, например, посмотреть, какие коммиты есть в любой из нескольких веток, которых нет в той ветке, в которой вы находитесь. Git позволяет вам сделать это, используя символ ^ или - не перед любой ссылкой, из которой вы не хотите видеть достижимые коммиты. Таким образом, эти три команды эквивалентны:
$ git log refA..refB
$ git log ^refA refB
$ git log refB --not refA
Это хорошо, потому что с помощью этого синтаксиса вы можете указать в запросе более двух ссылок, чего нельзя сделать с помощью синтаксиса с двумя точками. Например, если вы хотите увидеть все коммиты, которые доступны из refA или refB, но не из refC, вы можете ввести один из них:
$ git log refA refB ^refC
$ git log refA refB --not refC
Это создает очень мощную систему запросов о пересмотре, которая должна помочь вам определить, что находится в ваших ветках.
Тройная точка
Последний основной синтаксис выбора диапазона - это синтаксис с тройной точкой, который определяет все коммиты, которые достижимы любой из двух ссылок, но не обеими. Посмотрите на пример истории коммитов в:
Если вы хотите увидеть, что находится в мастере или эксперименте, но не какие-либо общие ссылки, вы можете запустить
$ git log master...experiment
F
E
D
C
Опять же, это дает вам нормальный вывод журнала, но показывает только информацию о коммите для этих четырех коммитов, отображаемую в традиционном порядке даты фиксации.
В этом случае общим ключом для использования с командой log является --left-right, который показывает, в какой части диапазона находится каждый коммит. Это помогает сделать данные более полезными:
$ git log --left-right master...experiment
< F
< E
> D
> C
С помощью этих инструментов вы можете гораздо проще сообщить Git, какие коммиты или коммиты вы хотите проверить.