Каковы различия между двуточечными ".." и тройными точками "..." в диапазонах Git commit?

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

В чем разница между этими двумя?

Ответ 1

Это зависит от того, используете ли вы команду 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 - не $(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 он совпадает с a git diff A B и просто отличает A от B. В случае log он показывает все коммиты, которые находятся в B, но не в А.

Ответ 2

Использование диапазонов Commit с помощью Git Log

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

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" diagramTree 1

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

  "git log A...B" diagramTree 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, имеют префикс с >.

Использование диапазонов Commit с Git Diff

Когда-нибудь я смогу добавить свое собственное объяснение того, как диапазоны фиксации работают с git diff, но пока вы можете проверить Каковы различия между двумя точками ".." и тройной точкой "..." в диапазоне Git diff commit?.

См. также