В чем разница между double-dot ".."и тройная точка" ... " в диапазонах git diff commit?
каковы различия между следующими командами?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
руководство diff об этом говорит так:
сравнивая отделения
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- изменения между подсказками темы и основными ветвями.
- то же, что и выше.
- изменения, произошедшие в главной ветви с момента запуска ветви темы.
но не совершенно ясно для меня.
4 ответа:
поскольку я уже создал эти образы, я подумал, что, возможно, стоит использовать их в другом ответе, хотя описание разницы между
..
(точка-точка) и...
(точка-точка-точка) по существу то же самое, что и в ответ manojlds.команда
git diff
обычно 1 показывает только разницу между состояниями дерева между ровно двумя точками в графе фиксации. Элемент..
и...
обозначения в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
, а не так. Третья схема как раз показывает что если вы перечислите две ветви, вы получите коммиты, которые находятся в одном или обоих из них.Ну, я нахожу, что все это немного запутанно, во всяком случае, и я думаю, что диаграммы диаграмм фиксации помогают :)
1 я говорю только "обычно", так как при разрешении конфликтов слияния, например,
git diff
покажет вам трехстороннее слияние.
git diff foo master
разница между верхними (головными) коммитами foo и master.
git diff foo..master
другой способ сделать то же самое.
git diff foo...master
отличие от общего предка (git merge-base foo master
) от foo и master до tip of master. Другими словами, показывает только те изменения, которые master branch ввел с момента своего общего предка с foo.из GitHub объясняет, Когда использовать два:
например, если вы создаете ветвь’ dev ' и добавить функцию к a файл, затем вернитесь в свою ветвь "master" и удалите строку из файла README, а затем запустить что-то вроде этого:
$ git diff master dev
он скажет вам, что функция была добавлена из первого файла и строка была добавлена в README. Зачем? Потому что на ветке, README все еще есть исходная строка, но на " master’ вы ее удалили-так что прямое сравнение снимков выглядит так, как будто " dev " добавил его.
что вы действительно хотите для сравнения-это то, что " dev " изменилось с момента вашего ветви разошлись. Для этого у Git есть хорошая небольшая стенография:
$ git diff master...dev
git diff foo master
покажет различия между темой и главной веткой в этот момент времени
git diff foo..master
Это также покажет различия между темой и главной веткой в этот момент времени
git diff foo...master
это покажет все различия между тем, когда тема была сделана из ветки и после
таким образом, первые 2 команды одинаковы, а последняя просто показывает более широкий вид в истории различий