Ответ RomainValeri является в основном правильным, но пропускает несколько пунктов.
Во-первых, мы должны отметить особый случай с версиями Git, предшествовавшими 1.8.4. В примечаниях к выпуску 1.8.4 упоминается, что
- "мастер происхождения git fetch" в отличие от "git fetch origin" или "git fetch" не обновлял "refs / remotes/ происхождение / мастер ";Это было раннее решение, чтобы сохранить предсказуемость обновления веток удаленного отслеживания, но на практике оказывается, что людям удобнее своевременно обновлять их всякий раз, когда у нас есть такая возможность, и мы обновляли их, когда запускаем «git push»."который уже нарушает первоначальную" предсказуемость "в любом случае.
Следовательно:
git fetch origin master
ведет себя иначе в Git 1.8.3 и более ранних версиях.В 1.8.4 и более поздних версиях это обновляет refs/remotes/origin/master
(по умолчанию, но это зависит от используемых вами по умолчанию ссылок на выборки).
Описание ссылки правильное, но отсутствует один элемент: в общем случае синтаксис:
- необязательный начальный знак плюс
+
, указывающий --force
(только для этой конкретной спецификации); - ссылка на источник;
- разделитель
:
;и - ссылка на пункт назначения.
Как источник, так и пункт назначения могут быть полностью определены, например, refs/heads/master
, или нет, например, master
.Если вы используете неквалифицированный вариант, Git выяснит, если это возможно, полностью квалифицированное написание.
В общем, любой (или иногда даже оба) источника и получателя может быть опущен.Значение такого refspec различно для git fetch
и git push
.Для пропуска источника необходимо добавить двоеточие, а опускание пункта назначения позволяет также опустить двоеточие.То есть:
master:master
, или branch1:branch2
, или tag:tag
и т. Д., Все обеспечивают источник и назначение. master
- источник безприемник. master:
также является источником без адресата. :master
является адресатом без источника.Это справедливо только для git push
, где это означает, что просит, чтобы другие Git удалили свою ссылку. . :
указывает, что и источник, и пункт назначения опущены.Это действительно только для git push
, где это означает, что находит соответствующие имена ветвей и нажимает на них .
Игнорируя git push
, мы разрешаем только источник и пункт назначения,как в master:origin/master
или master:master
, или в источнике без назначения, как в master
или master:
.Таким образом, есть только два случая:
Вы указали источник, но не указали пункт назначения.git fetch
не будет обновлять никакие имена, , за исключением , которые Git начиная с 1.8.4 будет своевременно обновлять любые удаленного слежения имен, как указано в refspec выборки по умолчанию.Поэтому, если ваш Git по крайней мере 1.8.4, git fetch origin master
обновит ваш origin/master
, который является именем вашего Git для удаленного отслеживания для master
Git's *1090*.
Вы указали источник и пункт назначения.git fetch
попытается обновить имя получателя.Если вы не установили флаг форсирования - либо глобальный, либо ведущий +
, - это обновление должно быть ускоренным.Если вы не указали --update-head-ok
, адресатом также не должна быть текущая ветвь. 1 В любом случае, если ваш Git версии 1.8.4 или новее, ваш Git будет своевременно обновлять имя удаленного отслеживания.для имени источника.
Обратите внимание, что:
git fetch origin
(который не указывает никаких refspecs в командной строке) будет использовать refspecs по умолчанию из вашей конфигурации.Предполагая, что это origin
, см. git config --get-all remote.origin.fetch
, чтобы увидеть эти refspecs по умолчанию.
1 В том, что я считаю ошибкой, тест здесь, для ветви извлечен , тестирует только HEAD
главное рабочего дерева *1118*.Если ветвь в настоящее время извлечена в добавленном рабочем дереве, индекс и рабочее дерево добавленного рабочего дерева больше не синхронизируются с его ветвью.См. Также Почему Git позволяет перемещаться в извлеченную ветку в добавленном рабочем дереве?Как мне восстановиться? - ошибка симметрична при извлечении и отправке.