Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git? - PullRequest
346 голосов
/ 20 января 2009

Некоторые команды Git принимают диапазоны фиксации, и один допустимый синтаксис - разделять два имени фиксации двумя точками .., а другой синтаксис использует три точки ....

Чем они отличаются?

Ответы [ 2 ]

536 голосов
/ 12 июня 2014

Использование диапазонов коммитов с Git Log

Когда вы используете диапазоны фиксации, такие как .. и ... с git log, разница между ними заключается в том, что для ветвей A и B

git log A..B

покажет вам все коммиты, которые есть у B, а у A нет , тогда как

git log A...B

покажет вам оба коммиты, которые есть у A, а которых нет, и коммиты, которые есть у B, которых нет у A, или, другими словами, будет отфильтровывать все коммиты, которые совместно используются A и B, таким образом, показывая только коммиты, которые они не совместно используют .

Визуализация с диаграммами Венна и деревьями коммитов

Вот визуальное представление git log A..B. Коммиты, которые содержит ветвь B, которых нет в A, возвращаются диапазоном коммитов, они выделяются красным цветом на диаграмме Венна и обводятся синим цветом в дереве коммитов:

Tree 1

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

Tree 2

Настройка диапазона фиксации тройной точки ... Более полезная

Вы можете сделать диапазон фиксации тройной точки ... более полезным в команде журнала, используя опцию --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? .

Смотрите также

220 голосов
/ 20 января 2009

Это зависит от того, используете ли вы команду log или diff. В случае log, это в документации man git-rev-parse:

Чтобы исключить коммиты, достижимые из коммита, используется префикс ^. Например. ^ r1 r2 означает коммиты, достижимые из r2, но исключая коммиты, достижимые из r1.

Эта операция установки появляется так часто что есть сокращение для этого. когда у вас есть два коммита r1 и r2 (названные в соответствии с синтаксисом, описанным в УКАЗАТЬ РЕЗУЛЬТАТЫ выше) попросить коммитов, которые достижимы из г2 за исключением тех, которые достижимы от r1 "^ r1 r2" и это можно записать как "r1..r2".

Аналогичная запись "r1 ... r2" называется симметричной разностью r1 и r2 и определяется как "r1 r2 - не $ (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, но не в А.

...