Разница между 'git истоком журнала/мастером' vs 'git истоком журнала/мастером..'

git log origin/master
git log origin/master..

Какая разница с вышесказанным? Я пытаюсь понять, что именно делает обозначение ... Я думал, что это диапазон, но в этом случае он делает что-то другое.

Ответ 1

С помощью git log (и всех других Git команд, которые принимают аналогичный набор аргументов), это спецификация того, как найти диапазон изменений, да. Помните, что в Git общем мире это означает некоторый подграф графика пересмотра --- для большинства людей, это обычно означает всего лишь ряд изменений в списке. (И если вы не много делаете, если какое-либо разветвление, это упрощается и в Git).

Спецификация пересмотра содержит набор положительных ссылок (начальных точек) и отрицательных ссылок (точек остановки) и дополнительных фильтров (предельное число ревизий, текст фиксации grep и т.д.). Git начинается с положительных ссылок и возвращается в историю изменений, останавливаясь, когда он сталкивается с ревизиями, которые достижимы из отрицательных ссылок (не обязательно, когда они достигают одной из отрицательных ссылок сами).

Возможно, довольно запутанно, что существуют различные сокращенные обозначения, которые эволюционировали, цель которых сделать все это проще в использовании, но все же как-то тоже смутить - мне пришлось потратить довольно много времени на то, чтобы выяснить, что такое "master..maint", "maint..master" и т.д., и когда использовать, который.

Когда вы просто говорите "происхождение/мастер", то это означает, что "источник/мастер" является положительной ссылкой, и нет никаких отрицательных ссылок. Таким образом, Git начинается с origin/master и проходит через все доступные версии - вы получаете полную историю происхождения/мастера.

"origin/master.." является сокращением для "origin/master..HEAD", который выглядит вроде как "from origin/master up to HEAD". Что он делает, эффективно. Его можно переписать как "HEAD ^ origin/master" или "HEAD - not origin/master". В этом случае HEAD является положительной ссылкой, а "origin/master" является отрицательной ссылкой. Таким образом, Git начинается с HEAD и проходит по графику до тех пор, пока он не встретит ревизию, доступную из источника/мастера. Вероятно, на самом деле он столкнется с происхождением/хозяином. Обратите внимание, что все ссылки включены - сами положительные ссылки выводятся, а отрицательные ссылки - нет (если вы не даете --граничный, а затем они помечены). Это означает, что "origin/master..HEAD" ничего не выводит, если HEAD и origin/master - это одна и та же ревизия.

Итак, если вы сделали пару локальных коммитов в верхней части вышерасположенной версии, у вас есть такая ситуация:

[email protected]:~/src/git <master>$ git log --pretty=oneline --abbrev-commit --decorate -n 4
ea3107d (refs/heads/master) Add another dummy comment
869c260 Add dummy comment
6345d7a (refs/remotes/origin/master, refs/remotes/origin/HEAD) Merge branch 'maint'
be427d7 allow -t abbreviation for --track in git branch

И теперь "git log origin/master.." означает, что Git начнется с HEAD (ea3107d), который недоступен из origin/master, поэтому он печатает это. Затем он возвращается к родительскому элементу HEAD (869c260), которого все еще нет, поэтому печатает это. Затем следующим родителем является 6345d7a, который является исходным/ведущим, поэтому он останавливается.

Обратите внимание, что "git log..origin/master" делает обратное - пытается вернуться от начала/мастера к HEAD. В этом случае он ничего не печатает. Но если я проверил "origin/maint", он напечатал ревизии по происхождению/хозяину, которые не были на происхождении /maint: так в общем, попробуйте подумать о "A..B" как "ревизии в B, которые не являются в A", и помните, что исключение A или B означает "HEAD".

Просто для лишней путаницы, есть также обозначение "A... B". Поэтому не забудьте подсчитать количество точек! В случае, когда A и B находятся в строке ревизий, нет никакой реальной разницы. Но то, что означает "A... B", означает ревизии в или B, которые не находятся ни в одной из баз слияния для A и B. Поэтому, если A и B находятся на расходящихся ветвях, он показывает все фиксации, сделанные на поскольку они расходились.

"Длинная форма" для диапазона пересмотра ( "B - не A" ) позволяет указать такие вещи, как "все ревизии в локальных ветвях, которые не находятся на какой-либо ветке удаленного отслеживания" ( "--branches - не -remotes" ). Этот список аргументов анализируется многими командами Git ( "git rev-list", являющийся основным), включая gitk. Таким образом, вы можете сделать "gitk --branches --not --remotes", чтобы графически увидеть ваши локальные изменения.

И, наконец, для путаницы с мега-бонусами команды типа "git diff" принимают тот же вид сокращенного синтаксиса, но это не значит (совершенно) то же самое. git diff фактически выполняет две ревизии и сравнивает их, что не совпадает с диапазоном - помните, что диапазон изменений в Git является подграфом, а не только списком. "git diff A..B" эквивалентен "git diff A B". "git diff A... B" означает "показать изменения в B, поскольку он отклоняется от A". Смешение? Немного: например, "git log A... B" и "git log B... A" означают одно и то же, но "git diff A... B" и "git diff B... A" do not.

Ответ 2

git log origin/master

Было бы (фальшивая команда):

git log INITIAL..origin/master

В то время как:

git log origin/master..

Есть:

git log origin/master..HEAD

Ответ 3

Я думаю, что это диапазон. Команда ".." покажет вам фиксации между последним фиксатором origin/master и любым последним фиксатором в ветки, на которой вы работаете.

Вы также можете указать ветку, которую хотите сравнить, поместив ее после..., так что она станет

git log origin/master..<branch_name>

Вы также можете использовать идентификаторы фиксации для фильтрации вывода, например:

git log 663f4c..fec6b

Попробуйте git help log, чтобы увидеть другие параметры: -)

Ответ 4

Мой собственный мнемонический способ запомнить семантику...

Я думаю о git log start..end 'в терминах диапазона дат, где начало представляет старшую часть истории, а конец для более поздней истории. Однако, в отличие от диапазона дат, диапазон фиксации не является линейным выходом и не имеет никакого отношения к фактическому времени, а скорее является вычитанием, т.е.:

(commits reachable from "end") - (commits reachable from "start")

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

Эффективно это относится ко всем коммитам, созданным между "start" (эксклюзивным) и "end" (включительно).