Ответ 1
Поскольку я уже создал эти изображения, я подумал, что стоит использовать их в другом ответе, хотя описание разницы между ..
(точка-точка) и ...
(точка-точка-точка) по существу такая же, как в manojlds answer.
Команда git diff
обычно¹ показывает только разницу между состояниями дерева между ровно двумя точками графа фиксации. Обозначения ..
и ...
в git diff
имеют следующие значения:
Другими словами, git diff foo..bar
точно совпадает с git diff foo bar
; оба будут показывать разницу между концами двух ветвей foo
и bar
. С другой стороны, git diff foo...bar
покажет вам разницу между "базой слияния" двух ветвей и концом bar
. "База слияния" обычно является последней фиксацией, общей между этими двумя ветвями, поэтому эта команда покажет вам изменения, внесенные вашей работой в bar
, игнорируя все, что было сделано на foo
в среднем.
Это все, что вам нужно знать о обозначениях ..
и ...
в git diff
. Однако...
... общий источник путаницы здесь состоит в том, что ..
и ...
означают тонко разные вещи при использовании в команде, такой как git log
, которая ожидает, что набор коммиттов будет одним или несколькими аргументами. (Эти команды в конечном итоге используют git rev-list
для анализа списка коммитов из своих аргументов.)
Значение ..
и ...
для git log
может быть показано графически, как показано ниже:
Итак, git rev-list foo..bar
показывает вам все на ветке bar
, которая также не находится на ветке foo
. С другой стороны, git rev-list foo...bar
показывает вам все коммиты, которые находятся в foo
или bar
, но не оба. Третья диаграмма показывает, что если вы перечислите две ветки, вы получите коммиты, которые находятся либо в одном, либо в обоих из них.
Ну, я считаю, что все немного запутанно, во всяком случае, и я думаю, что диаграммы диаграммы фиксации помогают:)
¹ Я говорю только "обычно", так как при разрешении конфликтов слияния, например, git diff
покажет вам трехстороннее слияние.