Трудно понять git-fetch

Мне трудно понять нюансы git-fetch. Я понимаю, что, делая fetch, выбирает удаленные ссылки в локальную ветку отслеживания.

У меня есть несколько вопросов, хотя:

  1. Возможно ли, что локальная ветвь отслеживания не существует? Если да, то будет ли он создан автоматически?

  2. Что произойдет, если я сделаю fetch и укажу не отслеживающую ветвь в качестве пункта назначения?

  3. Страница man для git-fetch указывает:

    git-fetch   
    

Как мне использовать refspec для извлечения содержимого из моего удаленного мастера в его ветку удаленного отслеживания? Я полагаю, что это возможно, если мой текущий заголовок находится на главном компьютере, и я запускаю

git fetch origin master

Однако, могу ли я использовать refspec <+?src:dest> для достижения того же самого? Я думаю, что это поможет мне лучше понять концепции.

И еще один вопрос:

мой. В файле git / config есть следующая строка для извлечения (показаны только соответствующие строки):

fetch = +refs/heads/*:refs/remotes/origin/*

Может кто-нибудь объяснить, что именно означает эта строка?

вопрос задан 1.07.2009
Parag
5015 репутация

4 ответов


  • 56 рейтинг

    Во-первых, нет такой концепции локального отслеживания веток, только удаленного отслеживания ветвей. Итак, origin / master - это удаленная ветвь отслеживания для master в репозитории origin .

    Обычно вы делаете git fetch $ remote , который обновляет все ваши удаленные ветви отслеживания и, при необходимости, создает новые.

    Однако вы также можете указать refspec, но он не будет затрагивать ваши удаленные ветви отслеживания, вместо этого он извлечет указанную вами ветку и сохранит ее в FETCH_HEAD, если вы не укажете пункт назначения. В общем, вы не хотите связываться с этим.

    Наконец,

    fetch = +refs/heads/*:refs/remotes/origin/*
    

    Это означает, что если вы делаете

    git fetch origin
    

    Это на самом деле будет делать:

    git fetch origin +refs/heads/*:refs/remotes/origin/*
    

    Это означает, что удаленный head / foobar будет локальным remotes / origin / foobar , а знак «плюс» означает, что они будут обновлены, даже если они не перемотаны вперед.

    Возможно, то, что вы считаете ветвью отслеживания, связано с git pull и конфигурацией слияния.

    ответ дан FelipeC, с репутацией 5926, 1.07.2009
  • 20 рейтинг

    felipec имеют ответил на большинство вопросов в своем ответе .

    Несколько оставшихся (большая часть взята из man-страницы git fetch ; в некоторых местах, к сожалению, немного устаревшей):

    • Если ветка удаленного отслеживания (ветвь, которая отслеживает некоторую ветвь в некотором удаленном хранилище) не существует, она будет создана.

    • Ветка, в которую вы выбираете ( в [+]:), не обязательно должна находиться в пространстве имен remotes//. Например, для зеркалирования репозиториев (git clone --mirror) refspec - от 1 до 1. В прежние времена перед разметкой отдельных удаленных устройств (до remotes// пространств имен для ссылок на удаленное отслеживание) главная ветка была выбрана в ветку с именем origin . Даже в настоящее время теги извлекаются непосредственно в пространство имен tags/ в зеркальном порядке.

    • Если ветвь, в которую вы загружаете (правая сторона refspec : существует, Git проверит, приведет ли загрузка к ускоренной перемотке вперед, т.е. е. если текущее состояние в является предком состояния в в данном удаленном хранилище. Если это не так, и вы не используете опцию -f/--force для git-fetch или префикс refspec с помощью '+' (используйте +: refspec), выборка откажется обновить эту ветку.

    • git fetch origin master эквивалентно git fetch origin master:, а не git fetch origin master:master; он сохраняет извлеченное значение основной ветки (удаленного источника происхождения ) в FETCH_HEAD , а не в основной ветке 329826958 или ветви remotes/origin/master удаленного отслеживания. Это может сопровождаться git merge FETCH_HEAD. Обычно не используется напрямую, но как часть одноразового извлечения без настройки ветки удаленного отслеживания: git pull .

    • +refs/heads/*:refs/remotes/origin/* как значение для удаленного . происхождение. переменная конфигурации fetch означает, что каждая ветвь (ссылка в пространстве имен refs/heads/) в удаленном источнике 998689583 происхождения выбирается в соответственно именованную ветвь удаленного отслеживания в пространстве имен refs/remotes/origin/, т.е. г. мастер филиал в происхождении (т.е. е. refs/heads/master ref) будет извлечен в ветку удаленного отслеживания происхождения / мастера 99868408 происхождения / мастера 998689583 (т.е. е. refs/remotes/origin/master исх.) Префикс «+» означает, что выборка будет успешной даже в случае не быстрой перемотки вперед, что означает, что ветвь на удаленном удалении перебазирована, или перемотана (сброс в какое-то состояние в прошлом) или иным образом исправлена.

    Sidenote: Возможно, вы захотите использовать команду git remote более высокого уровня для управления удаленными хранилищами и получения обновлений.

    ответ дан Jakub Narębski, с репутацией 203690, 1.07.2009
  • 4 рейтинг

    Обратите внимание, что теперь у основного сопровождающего для Git (Git 2. 1, август 2014) добавил это объяснение для git fetch :
    (См. commit fcb14b0 by Junio ​​C Hamano (gitster) :

    КОНФИГУРИРОВАННЫЕ ДИСТАНЦИОННО-ОТСЛЕЖИВНЫЕ ФИЛИАЛЫ

    Вы часто взаимодействуете с одним и тем же удаленным репозиторием, регулярно и многократно выбирая его. Чтобы отслеживать ход работы такого удаленного репозитория, git fetch позволяет настраивать remote..fetch переменных конфигурации.

    Обычно такая переменная может выглядеть так:

    [remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    

    Эта конфигурация используется двумя способами:

    • Когда git fetch выполняется без указания того, какие ветви и / или теги нужно извлечь в командной строке, e. г. Значения git fetch origin или git fetch, remote..fetch используются как refspecs - они указывают, какие ссылки выбирать, а какие локальные ссылки обновлять .
      Приведенный выше пример извлечет все ветви, которые существуют в origin (т.е. е. любой ссылки, которая соответствует левой части значения (refs/heads/*), и обновите соответствующие ветви удаленного отслеживания в иерархии refs/remotes/origin/*.

    • Когда git fetch запускается с явными ветвями и / или тегами для выборки в командной строке, e. г. git fetch origin master, с, заданные в командной строке, определяют, что нужно получить (например, г. master в примере, который является сокращением для master:, что, в свою очередь, означает «получить ветвь« master », но я не говорю явно, какую ветвь удаленного отслеживания обновлять с помощью командной строки»), и пример команда получит только ветку 'master'.
      Значения remote..fetch определяют, какая ветвь удаленного отслеживания, если таковая имеется, обновляется.
      При использовании таким образом значения remote..fetch не влияют на выбор того, что будет получено (т.е. е. значения не используются как refspecs, когда в командной строке перечисляются refspecs); они используются только для определения , где сохраненных ссылок сохраняются, действуя как отображение.

    ответ дан VonC, с репутацией 807261, 2.08.2014
  • 2 рейтинг

    Обратите внимание также, что с Git 2. 5+ (2 квартал 2015 года), git merge FETCH_HEAD может объединить нескольких git fetch.

    См. commit d45366e от Junio ​​C Hamano (gitster) , 26 марта 2015 г.
    (Объединено Junio ​​C Hamano - gitster - в commit bcd1ecd , 19 мая 2015 г.)

    «git merge FETCH_HEAD» узнал, что предыдущий «git fetch» мог создать слияние с Осьминогом, т.е. е. запись нескольких веток, которые не помечены как «не для слияния»;
    это позволяет нам потерять вызов старого стиля "git merge HEAD $commits..." в реализации скрипта "git pull"; синтаксис старого стиля теперь может быть устаревшим.

    git merge doc теперь упоминают:

    Если указано FETCH_HEAD (и без других коммитов), ветви, записанные в файле .git/FETCH_HEAD при предыдущем вызове git fetch для объединения, объединяются с текущей веткой .


    Git 2. 13 (Q2 2017) официально отменяет старый синтаксис для git merge.
    См. commit b439165 (26 марта 2015 г.) по Junio ​​C Hamano (gitster) .
    (Объединено Junio ​​C Hamano - gitster - в коммит 1fdbfc4 , 30 марта 2017)

    merge: отбросить синтаксис «git merge HEAD »

    Прекратить поддержку синтаксиса "git merge HEAD ", который имеет устарела с октября 2007 года и выдает предупреждение об устаревании начиная с v2. 5. 0.

    Это означает, что предупреждающее сообщение старого стиля «'git merge HEAD ' is deprecated.» больше не существует.

    ответ дан VonC, с репутацией 807261, 24.05.2015