Git belgelerinin aşağıdaki gibi şeyleri söylediğini görüyorsunuz
Şube HEAD'de tamamen birleştirilmelidir.
Peki Git HEAD
tam olarak nedir?
Git belgelerinin aşağıdaki gibi şeyleri söylediğini görüyorsunuz
Şube HEAD'de tamamen birleştirilmelidir.
Peki Git HEAD
tam olarak nedir?
Yanıtlar:
HEAD'ı "mevcut şube" olarak düşünebilirsiniz. Dalları değiştirdiğinizde git checkout
, HEAD revizyonu yeni dalın ucunu gösterecek şekilde değişir.
HEAD'in neyi işaret ettiğini görebilirsiniz:
cat .git/HEAD
Benim durumumda çıktı:
$ cat .git/HEAD
ref: refs/heads/master
HEAD'ın bir dal adıyla ilişkili olmayan belirli bir düzeltmeye başvurması mümkündür. Bu duruma müstakil KAFA denir .
Başkalarına alıntı yapmak için :
Bir kafa basitçe bir taahhüt nesnesine referanstır. Her kafanın bir adı vardır (dal adı veya etiket adı, vb.). Varsayılan olarak, her depoda master adı verilen bir kafa vardır. Bir havuz herhangi bir sayıda kafa içerebilir. Herhangi bir zamanda, bir kafa “mevcut kafa” olarak seçilir. Bu kafa HEAD ile her zaman başkentte takma adıdır ".
Bu farka dikkat edin: “kafa” (küçük harf), depodaki adlandırılmış kafalardan herhangi birini ifade eder; “HEAD” (büyük harf) sadece aktif durumda olan kafa anlamına gelir. Bu ayrım Git belgelerinde sıklıkla kullanılır.
Git'in iç işleyişini hızlı bir şekilde kapsayan bir başka iyi kaynak (ve bunun için kafaların / HEAD'ın daha iyi anlaşılması) burada bulunabilir . Kaynaklar (ref :) veya başkanlar veya şubeler, taahhüt tarihinde taahhüt edilen post-it notlar gibi düşünülebilir. Genellikle kaydedilmesini dizisinin ucuna işaret, ancak etrafında hareket ettirilebilir git checkout
veya git reset
vs.
git checkout HEAD~2
Bilinen bir kafanın taahhüt kimliği olmayan, belirttiğiniz taahhüdün taahhüt kimliğine ( örneğin, kullanarak ) işaret ediyor. Daha ayrıntılı bir açıklama için eagain.net/articles/git-for-computer-scientists adresindeki makaleye bakın .
git revert
bir dalı uçta olmamak için iyi bir örnek değildir, çünkü git revert
sadece bazı yeni taahhütler oluşturur ve mevcut dalı (yeni) uçta bırakır.
commit
s, reset
s, vb . Davranışlarını etkileyecektir
Ben github geliştirici Scott Chacon [ video referansı ] bu tanımı tavsiye :
Head şu anki dalınız. Sembolik bir referanstır. Bir dal için bir referanstır. Her zaman HEAD'ınız vardır, ancak HEAD bu işaretçilerden birini, bulunduğunuz dallardan birini işaret edecektir. Bir sonraki taahhüdünüzün ebeveyni. Çalışma dizininize en son teslim alınan şey budur ... Bu, çalışma dizininizin en son bilinen durumudur.
Tüm video tüm git sistemine adil bir giriş yapacak, bu yüzden de zamanınız varsa hepsini izlemenizi tavsiye ederim.
HEAD, şu anda bulunduğunuz yerel şubeye işaret eden özel bir işaretçi.
Gönderen Pro Git kitabının 3.1 Git dallanma - Ceviz Kabuğundaki Şube , bölümdeki Yeni Şubesi oluşturma :
Yeni bir şube oluşturursanız ne olur? Bunu yapmak, hareket etmeniz için yeni bir işaretçi oluşturur. Diyelim ki test adlı yeni bir dal oluşturdunuz. Bunu git branch komutuyla yaparsınız:
$ git branch testing
Bu, şu anda bulunduğunuz aynı taahhütte yeni bir işaretçi oluşturur
Git şu anda hangi şubede olduğunuzu nasıl biliyor? HEAD adında özel bir işaretçi tutar. Bunun, Subversion veya CVS gibi alışık olabileceğiniz diğer VCS'lerde HEAD konseptinden çok farklı olduğunu unutmayın. Git'te bu, şu anda bulunduğunuz yerel şubeye bir işarettir. Bu durumda, hâlâ ustasınız. Git branch komutu yalnızca yeni bir dal oluşturdu - bu dala geçmedi.
34ac2
Yukarıdaki örnekte ödeme yaparsanız , şimdi HEAD bu taahhüdü işaret ediyor ve buna müstakil HEAD deniyor. Bu durumda, değişiklikler yapabilir, deneyebilir ve değişiklikler uygulayabilirsiniz, ancak farklı bir şubeyi teslim aldığınızda, elbette yeni bir şube oluşturmadığınız sürece tüm değişikliklerinizi kaybedersiniz.
git log
şey yaptıysanız ve böyle bir şey varsa commit ad0265... HEAD -> foo ...
, foo
şube id yapmak için bir referans anlamına gelir ad0265
. Metin referansının bir kontrolünün yapılması foo
bağımsız bir başlık değildir. Taahhüt kimliğinin bir kontrolünün yapılması ad0265
kopuk bir kafaya neden olur. İletişim kurduğunuz şeyin bazı inceliklerini kaçırıyor olabilirim. Umarım bu metin duvarı nerede kaybolduğumu keşfetmeye yardımcı olur.
"Ayrı HEAD" adı verilen özel bir durum olmadığı varsayılırsa, O'Reilly Git kitabında belirtildiği gibi, 2. baskı, s.69, şu HEAD
anlama gelir:
HEAD
her zaman mevcut daldaki en son taahhüt anlamına gelir. Şubeleri değiştirdiğinizdeHEAD
, yeni şubenin en son taahhüdüne bakacak şekilde güncellenir.
yani
HEAD
olan cari şube "ucu" .
Biz kullanabileceği Not HEAD
işlemek En son başvurmak için, ve kullanım HEAD~
ucu önce taahhüt olarak ve HEAD~~
ya HEAD~2
daha erken işlemek ve benzeri şekilde.
Bu cevapların bir kısmında belki de ince ama önemli bir yanlış anlama var. Temizlemek için cevabımı ekleyeceğimi düşündüm.
Nedir
HEAD
?
HEAD
taahhüt geçmişinizde nerede olduğunuzu gösteren sembolik bir referanstır. Nereye giderseniz gidin, ne yaparsanız yapın, bir gölge gibi sizi izler. Bir taahhütte bulunursanız HEAD
, hareket eder. Bir şeyi kontrol ederseniz HEAD
, hareket edecektir. Ne yaparsanız yapın, taahhüt geçmişinizde yeni bir yere HEAD
taşındıysanız, sizinle birlikte taşındı. Sık rastlanan bir yanılgıya değinmek için: kendinizi ayıramazsınız HEAD
. Ayrılmış bir HEAD durumu bu değildir. Kendinizi şu şekilde düşünürseniz: "oh hayır, müstakil HEAD durumdayım! HEAD'ımı kaybettim!" Unutma, bu senin kafan. HEAD sensin. HEAD'tan ayrılmadınız, siz ve HEAD'iniz başka bir şeyden ayrıldınız.
HEAD
bir taahhüde işaret edebilir, evet, ama tipik olarak göstermez. Tekrar söyleyeyim. Genellikle HEAD
bir taahhüdü işaret etmez. Bir dal başvurusuna işaret eder. Bu dala eklenir ve belirli şeyleri (örneğin commit
veya reset
) yaptığınızda, ekli dal birlikte hareket edecektir HEAD
. Kaputun altına bakarak neye işaret ettiğini görebilirsiniz.
cat .git/HEAD
Normalde böyle bir şey alırsınız:
ref: refs/heads/master
Bazen böyle bir şey elde edersiniz:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
HEAD
Doğrudan bir taahhüdü işaret ettiğinde bu olur . Buna müstakil HEAD denir, çünkü HEAD
dal referansından başka bir şeye işaret eder. Bu durumda bir taahhütte bulunursanız master
, artık bağlı HEAD
değilsiniz, artık sizinle birlikte hareket etmeyecektir. Bu taahhüdün nerede olduğu önemli değil. Ana dalınızla aynı taahhütte olabilirsiniz, ancak daldan HEAD
ziyade taahhüdü işaret ediyorsa, koparılır ve yeni bir taahhüt, bir şube referansıyla ilişkilendirilmez.
Aşağıdaki egzersizi denerseniz buna grafiksel olarak bakabilirsiniz. Git deposundan bunu çalıştırın. Biraz farklı bir şey elde edersiniz, ancak anahtar bitleri orada olacaktır. Taahhüdü doğrudan kontrol etme zamanı geldiğinde, sadece ilk çıktıdan aldığınız kısaltılmış hash'ı kullanın (işte burada a3c485d
).
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
Tamam, bu yüzden buradaki çıktıda küçük bir fark var. Taahhüdü doğrudan kontrol etmek (dal yerine) bize ok yerine virgül verir. Ne düşünüyorsun, biz bağımsız bir HEAD durumunda mıyız? HEAD, bir şube adıyla ilişkili belirli bir düzeltmeyi ifade ediyor. Biz hala üzerinde biz ana dalı değil?
Şimdi dene:
git status
# HEAD detached at a3c485d
Hayır! Biz 'müstakil HEAD' durumundayız.
Sen aynı temsilini görebilirsiniz (HEAD -> branch)
vs. (HEAD, branch)
ile git log -1
.
HEAD
sensin. Nerede olursanız olun, teslim aldığınız her şeye işaret eder. Genellikle bu bir taahhüt değildir, bir daldır. Bir taahhüdü (veya etiketi) işaret ediyorsa HEAD
, bir şubenin de işaret ettiği aynı taahhüt (veya etiket) olsa bile, siz (ve HEAD
) o şubeden ayrıldınız. Size bağlı bir şubeniz olmadığı için, yeni taahhütlerde bulunduğunuzda şube sizi takip etmeyecektir. HEAD
ancak, olacaktır.
.git/HEAD
yazılımın HEAD olduğunu düşündüğü şeydir.
HEAD
çalışma kopyanızın işaret ettiği mevcut taahhüdü, yani şu anda teslim aldığınız taahhüdü belirtir. Git revizyonlarının belirtilmesine ilişkin resmi Linux Çekirdeği belgelerinden :
HEAD
Çalışma ağacındaki değişiklikleri temel aldığınız taahhüdü adlandırır.
Ancak, yaklaşmakta olan sürümde Git 1.8.4, @
ayrıca için bir kısaltma olarak kullanılabilir HEAD
olarak, onun Git Suçlama blog Git katkıyı Junio C Hamano tarafından da belirtildiği :
"HEAD" yazmak yerine "@" diyebilirsiniz, örneğin "git log @".
Stack Overflow kullanıcısı VonC , başka bir soruya cevabında neden @
kısayol olarak seçildiğine dair bazı ilginç bilgiler de buldu .
Ayrıca, bazı ortamlarda HEAD
, özellikle büyük / küçük harf duyarsız dosya sistemleri, özellikle Windows ve OS X kullanan işletim sistemlerinde büyük harf kullanımı gerekli değildir .
Şube oluşturma ve dallarda oynamaya göz atın
HEAD aslında içeriği HEAD değişkeninin nereye başvurduğunu belirleyen bir dosyadır:
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
Bu depoda, HEAD dosyasının içeriği refs / heads / master adlı ikinci bir dosyaya atıfta bulunur . Refs / heads / master dosyası , ana daldaki en son işlemlerin karmasını içerir.
Sonuç HEAD, .git / refs / heads / master dosyasındaki ana şube taahhüdüne işaret eder .
Greg Hewgil'in kabul edilen cevabında birkaç şeyi detaylandırmak istiyorum. Göre Git Cep Rehberi
Şube:
dalın kendisi, adlandırılan komuttan (dalın “ucu”) taahhüt grafiğinde ulaşılabilen tüm noktalar olarak tanımlanır.
KAFA: Özel bir Ref tipi
Özel ref HEAD hangi şubede olduğunuzu belirler ...
refs
Git iki tür referans tanımlar veya “refs” olarak adlandırdığı işaretçiler olarak adlandırılır:
- Doğrudan bir nesne kimliğine işaret eden basit bir ref (genellikle bir taahhüt veya etiket)
- Başka bir ref'ye (basit veya sembolik) işaret eden sembolik bir ref (veya symref)
Greg'in belirttiği gibi, HEAD "bağımsız bir durumda" olabilir. Dolayısıyla HEAD ya basit bir ref (ayrılmış bir HEAD için) ya da bir symref olabilir.
HEAD mevcut bir dal için sembolik bir referanssa, o dalda “açıksınız”. Öte yandan, HEAD bir taahhüdü doğrudan SHA-1 kimliğiyle adlandırmak için basit bir ref ise, o zaman herhangi bir dalda “değil”, daha önce bazılarına baktığınızda gerçekleşen “müstakil KAFA” modundasınız. inceleme taahhüdü.
Bence 'HEAD' şu anki çıkış işlemidir. Başka bir deyişle, 'HEAD' şu anda kullanıma alınmış olan taahhüdü işaret eder.
Eğer sadece klonlanmış ve teslim değil, ne işaret, muhtemelen bazı geçersiz konum bilmiyorum.
HEAD
şu anda check-out yaptığınız işlemdir. Ayrıntılar için kılavuza bakınız (ilgili paragraf hemen Şekil 3.4'ü takip eder).
master
dalı kontrol eder - böylece HEAD master'ı gösterir.
master
, ama her zaman değil. Bkz.remote set-head
remote set-head
yalnızca yerel varsayılan dalı etkileyen ve sunucudaki varsayılanı değiştirmeyen başvuru dışında doğruydu .
Kafa, o anda teslim alınmış dalın ucunu gösterir.
Deponuzda bir .git klasörü var. Dosyayı şu konumda açın: .git \ refs \ heads. Bu dosyadaki (sha-1 karma) kodu (çoğu durumda master) en son işlem olacaktır, yani komutun çıktısında görülen kod git log
. .Git klasörü hakkında daha fazla bilgi: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
git reset HEAD^
ve daha sonra en son taahhüt (eski uç) artık dalın ucuyla işaret edilmez .
Önceki tüm cevapları okuduktan sonra hala daha fazla netlik istedim. Resmi git web sitesindeki bu blog http://git-scm.com/blog bana aradığım şeyi verdi:
Git'te BAŞ olan işaretçi bir dönüş olduğunu akım şube referansı için işaretçi yaptığınız veya son senin çalışma dizine teslim edildi işlemek son tamamlama. Bu aynı zamanda yapacağınız bir sonraki taahhüdün de ebeveyni olacağı anlamına gelir. HEAD, son taahhüdünüzün fotoğrafı olduğu için bunu düşünmek genellikle en basit olanıdır.
HEAD
bir taahhüt değildir; o işaret biri.
checkout HEAD^
, şimdi HEAD herhangi bir daldaki son taahhüt görüntüsünü bile göstermiyor.
commit
, merge
, rebase
, log
"(işaretçi) mevcut konumu" vb Ama kavramsal olarak belki iyi bir özetidir.
Öyle hissettiriyor HEAD
, kontrol ettiğiniz son taahhüt için sadece bir etiket .
Bu, belirli bir dalın ucu ("ana" gibi) veya bir dalın aralarındaki bazı taahhütler ("ayrılmış kafa") olabilir.
Tüm tanımlara ek olarak, aklımda sıkışmış olan şey, bir taahhütte bulunduğunuzda, GIT'nin depo içinde bir taahhüt nesnesi oluşturmasıydı. Taahhüt nesnelerinin bir üst öğesi (veya bir birleştirme taahhüdü ise birden çok üst öğesi) olmalıdır. Peki, git mevcut taahhüdün ebeveynini nasıl biliyor? Bu yüzden HEAD, mevcut taahhüdün ebeveyni olacak son taahhüdün (referans) bir göstergesidir.
Bu ikisi sizi şaşırtabilir:
kafa
Yakın zamanda gönderilen bir şubeyi adlandırılmış referanslara işaret ediyor. Paket referansını kullanmadığınız sürece, kafalar genellikle $ GIT_DIR / refs / heads / içinde saklanır.
BAŞ
Mevcut dal veya çalışma ağacınız genellikle HEAD'ın işaret ettiği ağaçtan üretilir. Ayrı bir HEAD kullanmanız dışında HEAD bir kafaya bakmalıdır.
Bir göz atın http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
Şekil 3-5. Bulunduğunuz şubeyi gösteren HEAD dosyası.
Bir dal aslında gibi ID işlemek tutan bir işaretçidir 17a5 . BAŞ , kullanıcının şu anda üzerinde çalıştığı bir şubeye bir işarettir.
BAŞ , şuna benzeyen bir referans dosyasına sahiptir:
ref:
Bu dosyaları .git/HEAD
.git/refs
, içinde çalıştığınız depodaki dosyalara erişerek kontrol edebilirsiniz .
Git
tamamen taahhütlerle ilgilidir.
Ve Head
şu anda kontrol ettiğiniz taahhüdü işaret eder.
$ git cat-file -t HEAD
commit
Bir şubeyi her kontrol ettiğinizde, HEAD o daldaki en son taahhüdü işaret eder. HEAD içeriği aşağıdaki gibi kontrol edilebilir (ana dal için):
$ cat .git/refs/heads/master
b089141cc8a7d89d606b2f7c15bfdc48640a8e25
Kavram olarak, kafa bir daldaki en son revizyon. Her adlandırılmış dalda birden fazla başınız varsa, birleştirmeden yerel taahhütler verirken, adsız bir dal oluştururken büyük olasılıkla oluşturdunuz.
"Temiz" bir depoya sahip olmak için, adlandırılmış dal başına bir başınızın olması ve yerel olarak çalıştıktan sonra her zaman adlandırılmış bir dalla birleşmeniz gerekir.
Bu Mercurial için de geçerlidir .