Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git diff?
Каковы различия между следующими командами?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
Руководство по разным говорит об этом:
Сравнение ветвей
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- Изменения между подсказками темы и основными ветками.
- То же, что и выше.
- Изменения, которые произошли в основной ветке с момента запуска ветки темы.
но не совсем понятно для меня
4 ответа
Поскольку я уже создал эти изображения, я подумал, что, возможно, стоит использовать их в другом ответе, хотя описание разницы между ..
(точка-точка) и ...
(точка-точка-точка), по сути, такая же, как в ответе Манойлда.
Команда 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
, но не оба. Третья диаграмма показывает, что если вы перечислите две ветви, вы получите коммиты, которые находятся либо в одной, либо в обеих.
Ну, я нахожу, что все это немного сбивает с толку, в любом случае, и я думаю, что диаграммы графика коммитов помогают:)
Only Я говорю только "как правило", так как при разрешении конфликтов слияния, например, git diff
покажет вам трехстороннее слияние.
git diff foo master
Различаются между верхними (головными) коммитами foo и master.
git diff foo..master
Еще один способ сделать то же самое.
git diff foo...master
Отличаться от общего предка (git merge-base foo master
) фу и мастера на кончик мастера. Другими словами, показывает только те изменения, которые внесла основная ветка с момента ее общего предка с foo.
Этот пример из GitHub объясняет, когда использовать два:
Например, если вы создали ветку 'dev' и добавили функцию в файл, затем вернитесь к своей ветке 'master' и удалите строку из README, а затем запустите что-то вроде этого:
$ git diff master dev
Он скажет вам, что функция была добавлена из первого файла и строка была добавлена в README. Зачем? Потому что на ветке README все еще есть исходная строка, но на "master" вы удалили ее - поэтому прямое сравнение снимков выглядит так, как будто "dev" добавил ее.
То, что вы действительно хотите сравнить, это то, что изменилось с тех пор, как ваши ветви разошлись. Для этого у Git есть хорошая небольшая стенография:
$ git diff master...dev
git diff foo master
покажет разницу между темой и основной веткой на данный момент
git diff foo..master
это также покажет различия между темой и основной веткой в данный момент времени
git diff foo...master
это покажет все различия между тем, когда тема была сделана из ветки и после
поэтому первые 2 команды одинаковы, а последняя просто показывает более широкое представление в истории diff
Верхнее изображение эквивалентно нижнему дереву графика
A0 <- A1 <- A2 <- A3 (master)
\
C0 <- C1 (test)
Картинка стоит тысячи слов, разница между ..
...
^
показано ниже.
$ git log master..test
# output C0 C1
$ git log ^master test
# output C0 C1
$ git log master…test
# output A1 A2 A3 C0 C1