Ответы:
Это зависит от того, используете ли вы 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
и просто дифференциалы А против В. В log
случае, он показывает все коммиты , которые находятся в B , но не в А.
..
и ...
точно log A..B
поменяется местами для log и diff: это изменения от базы слияния к B, что и diff A...B
делает
git diff
.
A...B
== A..B + B..A
?
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
- префикс >
.
Когда-нибудь я мог бы добавить свое собственное объяснение того, как работают диапазоны фиксации git diff
, но сейчас вы можете проверить, каковы различия между двойной точкой ".." и тройной точкой "..." в коммите Git diff диапазоны? ,