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

но не совсем понятно для меня

4 ответа

Решение

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

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

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

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

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

Моя консолидированная версия .. vs ... с журналом diff vs

Diff vs Log &.. vs

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
Другие вопросы по тегам