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