Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git?
Некоторые команды Git принимают диапазоны фиксации, и один правильный синтаксис - разделять два имени фиксации двумя точками ..
и другой синтаксис использует три точки ...
,
Каковы различия между этими двумя?
6 ответов
Это зависит от того, используете ли вы log
команда или diff
команда. в log
дело, это в man git-rev-parse
документация:
Чтобы исключить коммиты, достижимые из коммита, используется префикс ^. Например, ^r1 r2 означает коммиты, достижимые из r2, но исключая коммиты, достижимые из r1.
Эта операция установки появляется так часто, что для нее есть сокращение. Если у вас есть два коммита r1 и r2 (названные в соответствии с синтаксисом, объясненным в УКАЗАННЫХ ПЕРЕСМОТРАХ выше), вы можете запросить коммиты, которые достижимы из r2, за исключением тех, которые достижимы из r1 с помощью "^r1 r2", и это можно записать как "r1..r2".
Подобное обозначение "r1...r2" называется симметричной разностью r1 и r2 и определяется как "r1 r2 -not $(git merge-base --all r1 r2)". Это набор коммитов, которые доступны с одного из r1 или r2, но не с обоих.
Что в основном означает, что вы получите все коммиты, которые находятся в любой из двух веток, но не в обеих.
в diff
дело, это в man git-diff
документация:
git diff [--options] <commit>...<commit> [--] [<path>...] This form is to view the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both <commit>. "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B". You can omit any one of <commit>, which has the same effect as using HEAD instead.
Что немного нечетко. По сути, это означает, что он показывает только различия в этой ветви по сравнению с другой веткой: он ищет последний общий коммит с первым коммитом, который вы ему дали, а затем переводит в него второй коммит. Это простой способ увидеть, какие изменения внесены в эту ветку, по сравнению с этой веткой, без учета изменений только в этой ветке.
..
несколько проще: в git-diff
случай, это так же, как git diff A B
и просто разногласия A против B. В log
В этом случае отображаются все коммиты, которые находятся в B, но не в A.
Использование диапазонов коммитов с Git Log
Когда вы используете диапазоны коммитов, такие как ..
а также ...
с git log
разница между ними в том, что для ветвей А и В
git log A..B
покажет вам все коммиты, которые есть у B, которых нет у A, а
git log A...B
покажет вам как коммиты, которые есть у A, так и у которых нет B, так и коммиты, которые есть у B, которых нет у A, или другими словами, он отфильтрует все коммиты, которые есть у A и B, таким образом, показывая только коммиты, которые они оба не разделяют.
Визуализация с диаграммами Венна и деревьями коммитов
Вот визуальное представление git log A..B
, Коммиты, содержащиеся в ветви B, которые не существуют в A, - это то, что возвращается диапазоном коммитов, подсвечивается красным на диаграмме Венна и обводится синим цветом в дереве коммитов:
Это диаграммы для git log A...B
, Обратите внимание, что коммиты, которые являются общими для обеих ветвей, не возвращаются командой:
Создание диапазона фиксации Triple Dot ...
Полезнее
Вы можете сделать диапазон фиксации тройной точки ...
более полезно в команде журнала с помощью --left-right
возможность показать, какие коммиты принадлежат какой ветке:
$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt
В приведенном выше выводе вы увидите коммиты, которые принадлежат master
имеют префикс <
, в то время как коммиты, которые принадлежат origin/master
имеют префикс >
,
Использование диапазонов коммитов с Git Diff
Когда-нибудь я мог бы добавить свое собственное объяснение того, как работают диапазоны фиксации. git diff
, но сейчас вы можете проверить, в чем разница между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git diff?,
Смотрите также
Я думаю, что самый большой источник путаницы по поводу двух точек по сравнению с тремя точками заключается в том, что при использовании с
Пожалуйста, просмотрите другие ответы, или фактическую документацию, или многочисленные сообщения в блогах для получения точных деталей, но я считаю, что эти простые утверждения хорошо работают для передачи правильной идеи :
git log A..B # Show me commits only on B.
git log A...B # Show me commits only on A or only on B.
git diff A..B # Show me changes only on A or only on B.
git diff A...B # Show me changes only on B.
Это немного сбивает с толку = Итак, вот как это на самом деле для этого потока
A---B---C topic
/
D---E---F---G master
https://github.com/alexcpn/gitdiffs/pull/2/commitshttps://github.com/alexcpn/gitdiffs/pull/1/commit
Поведение журнала Git
Обе нотации легко объяснимы независимо от конкретных команд Git, которые их используют.
Предположим, что а также это некоторые коммиты , поэтому они также могут быть названиями веток , тегов и т. д.
Затем во всех командах Git
A..B
обозначает диапазон от до (для всех команд Git ).
Принимая во внимание одно из двух значений:
где диапазон имеет смысл означает диапазон от последнего общего предка обоих до - это относится, в частности, к
git diff
,git log
или жеgit rev-list
,где диапазон не имеет смысла, но ожидается единственная фиксация
A...B
означает в точности последний общий предок обоих коммитов . Другими словами, это просто совершить , если оба находятся на одной и той же отрасли или последнего общего предка , как еслиA
а такжеB
находятся на разных ветвях (отмечен значкомX
на диаграмме ниже) - это относится, в частности, кgit checkout
,git branch
,git switch
или жеgit show
.
Когда команда Git может принимать ряд коммитов, и обе коммиты находятся в одной ветке , оба обозначения означают одно и то же .
Я подготовил диаграмму , иллюстрирующую оба обозначения:
Синтаксис '...' является сокращением для "различия между двумя ветвями, начиная с общего предка". Из официальной книги Git:
git diff master...contrib
эквивалентен:
$ git merge-base contrib master
36c7dba2c95e6bbb78dfa822519ecfec6e1ca649
$ git diff 36c7db