Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git diff? - PullRequest
165 голосов
/ 31 августа 2011

В чем различия между следующими командами?:

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 ]

280 голосов
/ 31 августа 2011

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

Команда git diff обычно показывает только разницу между состояниями дерева между двумя точками в графе фиксации. Обозначения .. и ... в 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, но , но не в обоих . Третья диаграмма просто показывает, что если вы перечислите две ветви, вы получите коммиты, которые находятся либо в одной, либо в обеих.

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

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

40 голосов
/ 21 сентября 2017

Моя сводная версия .. против ... с diff против log

Diff vs Log & .. vs ..

26 голосов
/ 31 августа 2011

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
6 голосов
/ 31 августа 2011
git diff foo master

покажет различия между темой и основной ветвью в тот момент времени

git diff foo..master

это также покажет различия между темой и основной ветвью в тот момент времени

git diff foo...master

это покажет все различия между тем, когда тема была сделана из ветки, и после

, поэтому первые 2 команды одинаковы, а последняя просто показывает более широкое представление в истории diff

...