git: різниця між "ім'ям гілки" та "посиланнями / головами / ім'ям гілки"


98

Найкраще це пояснити на прикладі: я перебуваю у гілці 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
Просто для адреси друкарської помилки в заголовку (не возитись зі старим заголовком, змінюючи його зараз) , він повинен читати "refs / heads / 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будуть показані повні назви посилань в історії
Галат

19

Дивіться, branchNameйого потрібно повністю вирішити, перш ніж GIT зможе насправді його ідентифікувати. Повністю вирішена назва буде refs/heads/branchName.

Одна з відомих команд git checkout branchNameнасправді автоматично вирішує її повністю, щоб визначити, де ви хочете замовити. Зверніть увагу, що він робить це автоматично, отже, ми ніколи не пишемо його повністю самостійно.

Як це робиться? Давайте подивимось тут

refname :, наприклад master, heads/master,refs/heads/master

Символічне посилання. Наприклад, master, як правило, означає об'єкт коміту, на який посилається refs/heads/master. Якщо у вас трапляються і те, heads/masterі інше tags/master, ви можете прямо сказати heads/masterсказати Git, який саме ви маєте на увазі. Коли двозначне, 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. Отже, нам ніколи не потрібно давати йому повністю вирішену галузьName.

Подивіться тут і тут теж.

Крім того, зайдіть у свій .gitкаталог і подивіться всередині refпапки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.