В чем разница между 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 команды одинаковы, а последняя просто показывает более широкий вид в истории различий


