Во-первых, имейте в виду, что --all
в git fetch
означает все пульты , а не все ссылки .То есть, если у вас обычный единственный пульт с именем origin
, --all
вообще ничего не делает.
Далее, имейте в виду разницу между именем ветви - именем вrefs/heads/
, например refs/heads/master
- и имя удаленного отслеживания , иногда называемое имя удаленного отслеживания , которое является ссылкой под refs/remotes/
, за которым следует имяудаленного.--prune
делает, чтобы удалить имена удаленного отслеживания, которые не имеют соответствующего имени на конкретном пульте.
Что обычно делает git fetch
:
- Вызвать Git наURL-адрес, сохраненный в этом пульте, например, из
git config --get remote.origin.url
при извлечении из origin
. - Пусть они перечислят свои ссылочные имена (запустите
git ls-remote
, чтобы увидеть их). - Обратитесь к этому Git для получения объектов Git - в основном, для фиксации объектов, но любые объекты из выходных данных на шаге 2 являются кандидатами - которые у них есть, а у нас нет, которых мы хотим (основываясь на любых дополнительных аргументах, данных
git fetch
,или настроенный параметр). Наконец, после получения всех объектов, создайте или обновите локальные имена, как правило, в форме refs/remotes/<em>remote</em>/<em>name</em>
, основываясь на именах ветвей, которые видны на этом пульте.Но смотрите ниже, потому что у этого шага есть сложности.
Именно во время этого обновления ваш Git может удалить некоторые из этих имен удаленного отслеживания, если вы включили сокращение (через --prune
или варианты конфигурации).Это все задолго до того, как git pull
, который запускает git fetch
, за которым следует вторая команда Git, может выполнить вторую команду Git.
Последняя, обратите внимание, что для --prune
работаетправильно, вам нужна типичная настройка remote.<em>remote</em>.fetch
, например, remote.origin.fetch
будет читать +refs/heads*:refs/remotes/origin/*
, а затем git fetch --prune
удалит из вашего собственного хранилища refs/remotes/origin/xyzzy
, если в хранилище Git нет refs/heads/xyzzy
на remote.origin.url
.Если вы сделали клон --single-branch
, строка remote.origin.fetch
будет иметь различное содержимое, а --prune
будет неэффективным.
Учитывая то, что вы наблюдали, вполне вероятно, что у вас был нестандартный параметр remote.origin.fetch
вероятно, из-за того, что создал клон как клон с одной ветвью.