git: разница между «имя ветки» и «ссылки / головы / имя ветки»

97

Лучше всего пояснить на примере: я нахожусь в ветке репозитория 0.58, и вот как я тяну:

git pull origin 0.58

Когда я просто вызываю "git pull", я получаю:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Кажется, я, вероятно, забыл какую-то опцию (--track?), Когда проверял эту ветку. Во всяком случае, я установил это сейчас:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

И это, кажется, работает. Затем, просто из интереса, я взглянул на другую ветку об этих настройках:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

Мне вот интересно, есть ли разница между «0,58» или мне следует указать «refs / Heads / 0,58»?

В чем именно разница?

Альберт
источник
1
Просто адресовать опечатка в названии (без баловаться со старым названием путем изменения его сейчас) , он должен читать «ссылки / глава / branchname» , headsс «S».
RomainValeri

Ответы:

129

A ref- это все, что указывает на фиксацию, например ветки (заголовки), теги и удаленные ветки. Вы должны увидеть заголовки, пульты и теги в своем .git/refsкаталоге, если у вас есть все три типа ссылок в вашем репозитории.

refs/heads/0.58указывает ветку с именем 0.58. Если вы не укажете, в каком пространстве имен находится ссылка, git будет искать в пространстве по умолчанию. Это делает использование только 0,58 предположительно неоднозначным - у вас может быть и ветвь, и тег с именем 0,58.

Каскабель
источник
3
Большое спасибо, это очень хорошо объясняет. Он просто работал с простым «0.58», так как такого именованного тега нет.
Альберт
1
Да, по сути, всегда будет все в порядке, но лучше перестраховаться.
Cascabel
Этот ответ - сокровище. Наконец кто-то объясняет Git, и мне это нравится! Спасибо.
aderchox
9
Вот они все для ясности: refs/heads/и refs/remotes/иrefs/tags/
Джим Ахо
41

Просто для тех, кому интересно - git show-ref, который доступен начиная с Git v1.8.2.2, покажет вам все ссылки, которые есть в вашем локальном репозитории.

Артем Долобанко
источник
3
Также git log --decorate=fullбудут показаны полные имена упоминаний в истории
galath
19

Видите ли, branchNameнеобходимо полностью решить, прежде чем GIT сможет его идентифицировать. Полностью разрешенное имя будет refs/heads/branchName.

Одна из известных команд git checkout branchNameфактически автоматически полностью разрешает его, чтобы определить, где вы хотите оформить заказ. Обратите внимание, что он делает это автоматически, поэтому мы никогда не пишем его полностью самостоятельно.

Как оно это делает ? Давайте посмотрим здесь

refname :, например master, heads/master,refs/heads/master

Символьное имя ссылки. Например, мастер обычно означает объект фиксации, на который ссылается refs/heads/master. Если у вас есть оба heads/masterи tags/master, вы можете прямо сказать heads/masterGit, какой из них вы имеете в виду. В случае неоднозначности a <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случае , если он существует.

Таким образом, с помощью вышеуказанных 6 шагов он пытается решить, что это такое branchName. Следовательно, нам никогда не нужно давать ему полностью разрешенное имя ветки.

Смотри сюда и сюда тоже.

Также зайдите в свой .gitкаталог и загляните в refпапку.

Число945
источник