“Git branch -r” çalıştırılırken neden “origin / HEAD” gösteriliyor?


160

Eğer çalıştırdığınızda git branch -ryangınlar o listelense neden origin/HEAD? Örneğin, GitHub'da iki dalı olan uzak bir repo var: ana ve harika özellik. Eğer git clonekapmak ve sonra benim yeni dizin gidin ve dalları listelemek yapmak, bunu görüyorum:

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

Ya da hangi sırada olursa olsun (alfa? Masum bir repo kimliğini gizli tutmak için bu örneği taklit ediyorum). Peki HEADiş nedir? O son kişi ne mi pushonların vardı HEADonlar itti zaman en sivri? Her zaman onlar ne olsaydı, olmayacak pushmı? HEADhareket ediyor ... neden bir başkasının HEADbaşka bir makinede neye işaret ettiğini umursuyorum ?

Sadece uzaktan izleme ve bununla başa çıkıyorum, bu yüzden devam eden bir karışıklık. Teşekkürler!

DÜZENLEME: Özel uzak depoların (hiç kimsenin bu kodu ssh ve üzerinde çalışmayacağı GitHub gibi, ancak sadece çekme veya itme, vb.) Bir başlığa sahip olmadığı ve olmaması gerektiği izlenimi altındaydım. çalışma kopyası yok. Öyle değil?


Yanıtlar:


140

@robinst doğru.

Git'te varsayılan olarak hangi şubenin teslim alınacağını seçebilirsiniz (yani klonladığınızda). Varsayılan olarak, origin/HEADbunu gösterecektir.

GitHub'da, GitHub deposunuzun Yönetici ayarlarında bunu değiştirebilirsiniz . Bunu komut satırı üzerinden de yapabilirsiniz.

git remote set-head origin trunk

veya üzerinden tamamen silin

git remote set-head origin -d

Örnek . 'Dalları Değiştir' açılır menüsüne bakın. trunkişaretlenir, böylece origin/HEADizler trunk.


Başka bir uzaktan kumanda olarak yeniden adlandırdım originve beni otherremote/HEAD -> masterrahatsız ediyordu. Komutunu çalıştırmak benim için düzeltildi.
Felipe Alvarez

59

Çıplak bir deponun bir KAFA'na sahip olmasının nedeni, deponun bir klonundan sonra ilk olarak hangi dalın kontrol edileceğini belirlediği için.

Normalde, HEAD master'a işaret eder ve insanlar depoyu klonladığında kontrol edilen daldır. Başka bir şubeye ayarlamak (çıplak depodaki HEAD'i düzenleyerek), bu dalın klonda teslim alınmasına neden olur.


2
Bu referansı zorlamadan kaldırmak mümkün olduğundan, origin/HEADyerel bir referans doğru mu? Kaldırmanın herhangi bir etkisi var originmı?
Zach Posten

@zposten: Hayır, silmenin origin/masteruzaktan kumandayı etkilememesi gibi.
Robinbin

Bu, klonlamadan sonra referansın sadece işe yaramaz bir bilgi parçası olduğu anlamına gelir.
Bachsau

@Bachsau başvurusu klonlanmıyor.
robinst

27

Adanmış uzak depoların (hiç kimsenin bu kodu kullanamayacağı ve bu kod üzerinde çalışacağı GitHub gibi), ancak sadece çekme veya itme, vb. kopyalayın. Öyle değil?

Dediğin gibi aynı izlenime sahiptim.

Ve github'dan klonlanan bu kökeni / HEAD uzaktan izleme dalını bile yapamıyorum

git branch -d -r origin/HEAD

Bunun bir etkisi yoktu.

Bazıları bana bu kaynak / KAFA uzaktan izleme şubesini nasıl silebileceğimi söyleyebilir mi?

Güncelleme

Github'dan klonlandığında neden bir kökeni / HEAD oluşturulduğunu bulamasam da, onu silmek için bir yol buluyorum.

Git yeni sürümü

git remote set-head <name> -d

uzaktan izleme dalının yararsız KAFA işaretçisini silmek için.

Ayrıca aptal varsayılan adı 'orijinini' kullanarak istediğimiz her şeyi değiştirebiliriz

git remote rename origin <new_name>

Umarım bu yardımcı olabilir. :)


Aynı sorunu yaşıyorum (GitHub'da bile) ve set-head işe yaramadı. 'Git remote set-head HEAD -d' yi çalıştırmalı mıyım?
Joost Schuur

5
@Joost: it'sgit remote set-head origin -d
znq

13

Bunu yaptıkları anda karşı iterek çalıştıkları dizinleri olmadığı zamanlarda olduklarında adanmış uzak repo çok daha iyi çalışmak olduğunu, 'çıplak'. Git'in mimarisi, dağıtılmış bir VCS'de anlamlı olan yamalar veya pull( fetch) ile güncellenmek üzere tasarlanmıştır . Dokümanların bir yerde söylediği gibi, şu anda kullanıma alınmış bir şubeye gitmek "beklenmeyen sonuçlar" ile sonuçlanabilir .

HEAD, geçerli bir veri havuzu gereksinimlerinin bir parçasıdır. Git Depo Düzeni diyor ki:

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.

Yani HEAD'ı "çok fazla bir anlam ifade etmiyor ..." olsa bile, şube listesinin bir parçası olarak göreceksiniz.


Bu mantıklı değil. Depolar çıplak başlar ancak onlara bir şey bastığınız anda artık çıplak olmazlar ve üzerlerinde "git dalını" çalıştırırsanız, şu anda teslim alınmış bir dal gösterirler.
jeoidesic

@jeoidesic Bir havuz, onu itmiş olsanız bile çıplak olabilir. Aşağıdakiler 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.baredoğrudur. Ayrıca bu komutlar üzerine foobar deposunda itilen dosyanın çalışma kopyası yoktur.
Anders Lindén

@jeoidesic Bir havuz, onu itmiş olsanız bile çıplak olabilir. Aşağıdakiler 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.baredoğrudur. Ayrıca bu komutlar üzerine foobar deposunda itilen dosyanın çalışma kopyası yoktur.
Anders Lindén

@geoidesic A --bare git repo, çalışma ağacı olmayan bir repo, yani yalnızca .git-dizini içeren ancak teslim alınmış dosyaları bulunmayan bir repo anlamına gelir. Teslim alınan dosyalar bulunamadığından, aslında bir .git dizini bile yoktur, tüm .git dosyalarını doğrudan ana dizine koyar. Bir tane oluşturun ve göreceksiniz!
prometheus

5

"Orijin" uzak bir havuzsa, orijin / HEAD o uzak depodaki varsayılan dalı tanımlar.

Misal:

$ 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 şube: master" yazan satıra dikkat edin. Uzak depo, istemcilerin varsayılan olarak hangi şubeye ödeme yapacağını bildikleri yerdir.


1

Her zaman , uzak repoda şu anda teslim alınan dalı işaret eden bir KAFA vardır (bu yönetici olabilir veya olmayabilir). Uzak depoların bile mevcut şubeleri vardır. Genellikle ustadır ve kafamın tepesinden değiştirmek için herhangi bir neden düşünemiyorum, ama değiştirilebilir.


2
github depoları şubeleri kontrol etmedi. Bunun neden geçerli olduğunu anlamıyorum.
Dustin

Uzak depoların çalışan bir dizini OLMAMALIDIR. Uzak depolar - çıplak olmalıdır ve bu nedenle şu anda kullanıma alınmış bir dalı olamaz.
n4rzul

-14

Tahminimce biri bir kolu itti ve HEAD dedi:

git push origin HEAD

Bu konuda neyin yanlış olduğuna dair bazı yorumlar alabilir miyim? Github'da bir kökeni / KAFA istiyorsanız, oraya ulaşmanın tek yolu budur.
Dustin

Uzak KAFA sembolik bir ref'dir (genellikle refs / heads / master'a). Sembolik ref yerine mevcut dalınızın taahhüdünün karma kimliğini koyacaksınız.
Daniel Fanjul

2
Tahminler kesin olmayan bir cevap olmak yerine yorumlarda tartışılmamalı mı?
Luciano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.