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

но не совершенно ясно для меня.

4 139

4 ответа:

поскольку я уже создал эти образы, я подумал, что, возможно, стоит использовать их в другом ответе, хотя описание разницы между .. (точка-точка) и ... (точка-точка-точка) по существу то же самое, что и в ответ manojlds.

команда git diff обычно 1 показывает только разницу между состояниями дерева между ровно двумя точками в графе фиксации. Элемент .. и ... обозначения в git diff имеют следующие значения:

An illustration of the different ways of specifying commits for 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 может быть показано графически, как показано ниже:

An illustration of the different ways of specifying ranges of commits for git log

и git rev-list foo..bar показывает вам все на ветке bar это тоже не на ветке foo. С другой стороны, git rev-list foo...bar показывает вам все коммиты, которые находятся в любом fooилиbar, а не так. Третья схема как раз показывает что если вы перечислите две ветви, вы получите коммиты, которые находятся в одном или обоих из них.

Ну, я нахожу, что все это немного запутанно, во всяком случае, и я думаю, что диаграммы диаграмм фиксации помогают :)

1 я говорю только "обычно", так как при разрешении конфликтов слияния, например,git diff покажет вам трехстороннее слияние.

моя консолидированная версия .. vs ... С diff vs log

Diff vs Log & .. vs ..

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