Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов 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, - это то, что возвращается диапазоном коммитов, подсвечивается красным на диаграмме Венна и обводится синим цветом в дереве коммитов:

диаграмма Дерево 1

Это диаграммы для git log A...B, Обратите внимание, что коммиты, которые являются общими для обеих ветвей, не возвращаются командой:

диаграмма Дерево 2

Создание диапазона фиксации 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
Другие вопросы по тегам