Чому під час запуску "git гілка -r" відображається "origin / HEAD"?


160

Коли ти запускаєшся, git branch -rчому це списки origin/HEAD? Наприклад, є віддалений репо на GitHub, скажімо, з двома гілками: master та awesome-особливість. Якщо я git cloneзахоплю його, а потім перейду до мого нового каталогу та перелічу гілки, я бачу таке:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Або в якому б порядку не було (альфа? Я підробляю цей приклад, щоб зберігати особу невинного репо в таємниці). То в чому HEADсправа? Є чи це те , що остання людина , pushмав їх HEADзагострені в тому, коли вони виштовхнули? Чи не завжди це буде, як би там не було push? HEADs рухатися навколо ... чому мені байдуже, на кого хто HEADвказував на іншій машині?

Я просто отримую ручку на віддалене відстеження і таке, тож це одна тривала плутанина. Дякую!

EDIT: У мене було враження, що спеціальні віддалені репости (як, наприклад, GitHub, де ніхто не впишеться і не буде працювати над цим кодом, а лише тягнути або натискати і т. Д.) Не мали і не повинні мати ГОЛОВИ, тому що, в основному, немає робочої копії. Не так?


Відповіді:


140

@robinst правильний.

У git ви можете вибрати, яка галузь перевіряється за замовчуванням (тобто, коли ви клонуєте). За замовчуванням на origin/HEADце вкаже.

У GitHub ви можете змінити це в налаштуваннях адміністратора для репортажу GitHub. Ви також можете зробити це з командного рядка через

git remote set-head origin trunk

або видалити його цілком через

git remote set-head origin -d

Приклад . Подивіться на спадне меню "Перемикання гілок". trunkперевіряється, так origin/HEADвипливає trunk.


Я перейменував інший дистанційний, щоб бути, originі моя otherremote/HEAD -> masterтурбувала мене. Виконання вашої команди зафіксувало це для мене.
Феліпе Альварес

59

Причиною, що у голого сховища може бути HEAD, є те, що воно визначає, яку гілку спочатку перевіряють після клонування сховища.

Зазвичай HEAD вказує на майстра, і це гілка, яку перевіряють, коли люди клонують сховище. Якщо встановити його на іншу гілку (відредагувавши HEAD у голому сховищі), ця гілка перевіряється на клоні.


2
Оскільки можна видалити цю посилання без натискання, origin/HEADчи правильно вказана локальна посилання? Чи впливає його видалення origin?
Зак Постен

@zposten: Ні, так само, як видалення origin/masterне впливає на віддалене.
Робінст

Це означало б, що після клонування посилання є лише марною інформацією.
Бахсау

@Bachsau посилання не клонується.
robinst

27

У мене склалося враження, що виділені віддалені репости (наприклад, GitHub, де ніхто не впишеться і не буде працювати над цим кодом, а лише тягнути або натискати і т. Д.) Не мав і не повинен мати ГОЛОВУ, тому що в основному роботи не було копія. Не так?

У мене було таке саме враження, як ви сказали.

І я навіть не можу видалити цю гілку віддаленого відслідковування походження / HEAD, клоновану з Github тим самим

git branch -d -r origin/HEAD

Це не мало ефекту.

Чи може хтось мені сказати, як я можу видалити цю гілку віддаленого відстеження походження / HEAD?

оновлення

Хоча я не знайшов, чому існує походження / HEAD, створене при клонуванні з github, я знаходжу спосіб видалити його.

Нова версія git передбачена

git remote set-head <name> -d

видалити марний покажчик HEAD відділення віддаленого відстеження.

І ми також можемо змінити тупу назву за замовчуванням 'походження' на все, що хочемо, використовуючи

git remote rename origin <new_name>

Сподіваюся, що це може допомогти. :)


У мене така ж проблема (навіть у GitHub), і у set-head не працювало. Чи повинен я працювати з "git віддаленою головкою HEAD -d"?
Joost Schuur

5
@Joost: цеgit remote set-head origin -d
znq

13

Ви маєте рацію, що натискання на виділені віддалені репости працюють набагато краще, коли вони 'голі', тобто коли у них немає робочих каталогів. Архітектура Git розроблена для оновлення за допомогою патчів або pull( fetch), що має сенс у розподіленому VCS. Як десь кажуть документи, натискання на гілку, яка зараз перевіряється, може призвести до "несподіваних результатів" .

HEAD є частиною вимог до дійсного сховища. Макет репозиторію Git частково говорить:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Таким чином, ви збираєтесь бачити HEAD як частину списку філій, навіть якщо "це не означає багато ..."


Це не має сенсу. Сховища починаються оголеними, але щойно ви щось натискаєте на них, вони вже не голі, і якщо ви запускаєте на них "git гілку", вони показують гілку, яку ви перевірили.
геодезик

@geoidesic Сховище може бути голим, навіть якщо ви натиснули на нього. Наступне: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareвиводить true. Також у цих репортах немає робочої копії висунутого файлу у foobar repo.
Андерс Лінден

@geoidesic Сховище може бути голим, навіть якщо ви натиснули на нього. Наступне: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareвиводить true. Також у цих репортах немає робочої копії висунутого файлу у foobar repo.
Андерс Лінден

@geoidesic A --bare git repo просто означає репо без жодного робочого дерева, тобто репо, що містить лише .git-каталог, але не може взагалі не мати перевірених файлів. Оскільки він не може мати жодних перевірених файлів, він фактично навіть не має .git-каталогу, він просто розміщує всі .git-файли безпосередньо в головному каталозі. Створіть його і побачите!
00прометей

5

Якщо "origin" є віддаленим сховищем, тоді origin / HEAD ідентифікує гілку за замовчуванням у цьому віддаленому сховищі.

Приклад:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Зауважте рядок із написом "HEAD branch: master". Тут віддалений сховище дає змогу клієнтам знати, яку галузь за замовчуванням перевірити.


1

Завжди є HEAD, який вказує на поточно перевірену гілку на віддаленому репо (що може бути, а може і не бути майстром). Навіть віддалені сховища мають поточні відділення. Зазвичай це майстер, і вгорі голови я не можу придумати жодної причини, чому хтось хотів би його змінити, але це можна змінити.


2
github repos не має перевірених гілок. Я не бачу, чому це стосується.
Дастін

Віддалені сховища НЕ повинні мати робочий каталог. Віддалені сховища повинні бути --безпечними і, таким чином, не можуть мати гілку, що перевіряється на даний момент.
n4rzul

-14

Я здогадуюсь, що хтось штовхнув гілку і назвав її HEAD:

git push origin HEAD

Чи можу я отримати коментарі щодо того, що з цим не так? Якщо ви хочете походження / HEAD на github, це єдиний спосіб, який я знаю, щоб отримати його там.
Дастін

Віддалений HEAD - це символічний перелік (як правило, для refs / heads / master). Ви заміните символічний ref на хеш-код комісії вашої поточної гілки.
Даніель Фанджул

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