git: разница между "branchname" и "refs / head / branchname" - PullRequest
70 голосов
/ 06 октября 2009

Лучше всего объяснить на примере: я нахожусь на ветке 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 / head / 0.58"?

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

Ответы [ 3 ]

91 голосов
/ 06 октября 2009

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

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

30 голосов
/ 17 января 2017

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

8 голосов
/ 05 мая 2018

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

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

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

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

Символическое имя ссылки. Например. master обычно означает объект commit ссылка на refs/heads/master. Если у вас есть оба heads/master и tags/master, вы можете явно сказать heads/master скажи Гиту, кого ты имеешь в виду. Когда неоднозначно, <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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...