2016-06-02 3 views
0

Почему поведениеПочему поведение git fetch origin + refs/heads/master: refs/remotes/origin/mymaster и git fetch origin master: mymaster отличается?

git fetch origin +refs/heads/master:refs/remotes/origin/mymaster 

и

git fetch origin master:mymaster 

отличается?

По моим наблюдениям в случае

git fetch origin +refs/heads/master:refs/remotes/origin/mymaster 

это было создание удаленного отслеживания филиала «mymaster».

С другой случай

git fetch origin master:mymaster 

было создание местного филиала "mymaster".

ответ

1

Well git fetch ускорит переадресацию вашей локальной ссылки и создаст ее, если она не существует. Итак:

git fetch origin master:mymaster 

создает ветвь mymaster локально, если он не существует и

git fetch origin +refs/heads/master:refs/remotes/origin/mymaster 

создает ветвь remotes/origin/mymaster локально, если она не существует.

Синтаксис src:dst, где src удален и dst местный.

+1

Heads-up для OP: также обратите внимание, что '+' означает «force», что делает обновление успешным, даже если новая история для обновления ref не полностью содержит старую (то есть обновление не приведет к так называемая «быстрая перемотка вперед» и обычно отклоняется). IOW, у вас есть два важных различия между вашими рефспекторами, а не с одним. – kostix

1

Прочтите справочную страницу gitrevisions (введите git help revisions) и найдите спецификацию для пересмотра «<refname>». Вот выдержка из этой части документации:

<refname>, например. master, heads/master, refs/heads/master

Символическое название ссылки. Например. master обычно означает объект фиксации , на который ссылается refs/heads/master. Если у вас есть как heads/master, так и tags/master, вы можете прямо сказать heads/master, чтобы сообщить Git, который вы имеете в виду. При неоднозначной, <refname> будет снято неоднозначность, принимая первый матч в следующих правилах:

  1. Если $GIT_DIR/<refname> существует, то есть то, что вы имеете в виду (это, как правило, используется только для HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD и CHERRY_PICK_HEAD);
  2. в противном случае refs/<refname> если таковой существует;
  3. в противном случае refs/tags/<refname> если таковой существует;
  4. в противном случае refs/heads/<refname> если таковой существует;
  5. в противном случае, refs/remotes/<refname> если он существует;
  6. в противном случае, refs/remotes/<refname>/HEAD если есть.

Так что вы наблюдали в своих экспериментах, что, когда вы использовали прикрасы mybranch в качестве мишени рефа имени, с точки зрения Git, который был родственник исм именем, и, следовательно, Git используется правила приоритета, чтобы разрешить его, и разрешил его до refs/heads/mymaster.

Когда вы использовали refs/remotes/origin/mymaster, вы указали Git с абсолютным именем ref, поэтому не было ничего, что можно было бы решить, и Git использовал его напрямую.

Ознакомительная поездка: вполне нормально иметь локальную ветвь, содержащую косую черту в названии, и она по-прежнему будет относительной, если не указывать refs/... якорь. То есть, вы можете сделать git branch foo/bar, и когда вы позже позвоните git log foo/bar Git будет использовать приведенные выше правила, чтобы разрешить foo/bar в абсолютное имя ref (и предположительно в итоге получится refs/heads/foo/bar).

Смежные вопросы