Вывод извлечения сбивает с толку даже старой руке.Вот как я их декодирую:
* branch feature/8067 -> FETCH_HEAD
* [new branch] feature/8067 -> origin/feature/8067
Работа с каждой строкой справа налево:
Первая строка заканчивается FETCH_HEAD
,Это означает, что ссылка была депонирована в FETCH_HEAD
.См. Примечание о FETCH_HEAD
ниже.Стрелка жестко закодирована (всегда появляется, и вы можете просто ее игнорировать);имя feature/8067
- это имя ссылки на пульте дистанционного управления;и * branch
говорит вам, что на самом деле это был refs/heads/feature/8067
на удаленном компьютере, т. е. был филиалом.Поскольку это было внесено в FETCH_HEAD
, дополнительная информация недоступна.
Вторая строка заканчивается origin/feature/8067
.Ваше имя для удаленного отслеживания 1 origin/feature/8067
(полное имя refs/remotes/origin/feature/8067
) создано или обновлено.Как и раньше, у нас есть стрелка и то же имя.Тогда у нас есть * [new branch]
: это говорит нам о том, что origin/feature/8067
раньше не существовало, и что feature/8067
было - как мы уже знаем - именем ветви на пульте.
Вот что я получаю, обновляя Git-репозиторий для Git:
ab15ad1a3b..aa25c82427 master -> origin/master
ef7435264c..5a294203ad next -> origin/next
+ f98c0007ae...e49ac33073 pu -> origin/pu (forced update)
0f4b6a451a..ff8db353a4 todo -> origin/todo
* [new tag] v2.22.0-rc1 -> v2.22.0-rc1
И снова мы можем работать справа налево:
My origin/master
был создан или обновлен с их master
.Значение моего origin/master
было ab15ad1a3b
, но теперь aa25c82427
.Поскольку было значение, оно было обновлено, а не создано.
Мой origin/next
был создан или обновлен, а все остальное в основном такое же, как указано выше (по модулю очевидные различия).
Мой origin/pu
был обновлен принудительно, т. Е. Это не ускоренная перемотка вперед, и некоторые коммиты были удалены .Источником была их ветка pu
, а моим origin/pu
был f98c0007ae
, но теперь он ff8db353a4
.Тот факт, что между двумя идентификаторами хэша есть три точки, а в других строках - только две точки, означает, что обновление было принудительным, а следовательно, не ускоренным переходом.Знак «плюс» в самом начале означает, что обновление было принудительным.(Очевидно, что очень важно, чтобы обновление было принудительным: у меня есть три объявления на этот счет!)
Мой origin/todo
был создан или обновлени к тому времени, как мы доберемся до левой стороны, это, очевидно, обновление.
Мои v2.22.0-rc1
были созданы или обновлены из их v2.22.0-rc1
;это новый тег.
Каждый раз, когда у вас есть новое имя (ветвь, тег или любая другая ссылка), это по определению обычное принудительное создание, а * 1082 нет* хеш доступен, поэтому левый край будет читать * [new whatever]
.
FETCH_HEAD
особенный: все обновления записываются в .git/FETCH_HEAD
, обычно стирая все, что было в нем раньше (но с -a
или --append
вместо этого добавится git fetch
).Каждая извлеченная ссылка приводит к тому, что одна строка появляется в FETCH_HEAD
, давая:
Одна строка, которая не помечена not-for-merge
, подходит для сценария git pull
2 чтобы выловить и передать этот хэш-идентификатор git merge
или git rebase
.
1 A имя для удаленного слежения ,который большая часть Git называет веткой удаленного отслеживания , является ссылкой в вашем хранилище, полное имя которой начинается с refs/remotes/
и включает в себя имя удаленного, в этомcase origin
и еще один слеш, а затем обычно содержит остальную часть имени branch , как видно на этом пульте.
A reference - это просто обобщенное имя для вещей, которые являются ветвями, тегами, именами удаленного отслеживания, refs/stash
и т. Д .: имя в формате строки, обычно начинающееся с refs/
, которое запоминает один хеш Я БЫ. Для ветки один хэш-идентификатор, который помнит имя, - это коммит, который Git должен считать tip этой ветки. Для тега один идентификатор хеша, который запоминает имя, является либо идентификатором хеша фиксации, либо идентификатором хеша аннотированного объекта тега , который содержит дополнительную информацию (возможно, включая ключ подписи), плюс хэш Идентификатор помеченного объекта (обычно коммит, хотя любой тег может указывать на любой из внутренних типов объектов Git).
Git создает имена для удаленного отслеживания через refspec . Вы можете указать refspec при запуске git fetch
. Если вы не предоставляете refspec, но предоставляете удаленное имя как origin
, Git выдает правильный refspec из вашей конфигурации:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Стандартная конфигурация для origin
всегда имеет эту точную стандартную ссылку, но есть несколько полезных нестандартных конфигураций, таких как созданная git clone --single-branch
. Вы также можете сделать свои собственные совершенно причудливые refspecs, хотя в зависимости от того, как вы получите, некоторые комбинации приведут к неработоспособности git fetch
.
2 Ну, во всяком случае, тогда, когда git pull
был сценарием. Это было перекодировано в C для скорости на Windows.