Git'teki KAFA nedir?


232

Son işlem, HEAD ve dizinimde görebildiğim dosyanın durumu arasında bir fark var gibi görünüyor.

KAFA nedir, bununla ne yapabilirim ve hangi hatadan kaçınmalıyım?



1
, Git v1.8.4 ile kullanımla altındaki tüm cevapları başlayan HEADveya headartık kullanabilirsiniz @yerine HEADyerine. Bkz bu cevabı (son bölüm) bunu yapabilir nedenini öğrenmek için.

3
Git-scm'den : Git'teki HEAD, geçerli şube başvurusunun işaretçisi olup, bu da yaptığınız son işleme veya çalışma dizininize teslim edilen son işleme işaret eder. 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.
Quazi Irfan

3
Git'teki HEAD nedir?
Buts

Yanıtlar:


185

HEAD, şu anda kullanıma alınmış daldaki son işleme referanstır.


Ayrılmış HEAD olan küçük bir istisna söz konusudur. Bir müstakil BAŞ size kontrol ne zaman sona durum işlemek yerine şube (veya etiketi). Bu durumda, bunu isimsiz geçici bir şube olarak hayal etmelisiniz ; bu nedenle, adlandırılmış bir şube başvurusu yerine, yalnızca HEAD var. Taahhüt yapmanıza izin verir (HEAD'ı güncelleyecektir), bu nedenle, ayrılmış bir HEAD'ı adsız geçici bir dal olarak düşünüyorsanız, yukarıdaki kısa tanım hala doğrudur.


1
Öyleyse neden iki kafanız olabilir?
e-satis

1
@ e-satis: bazen dal denilen dalları görürsünüz - depolanırlar refs/heads. Ancak küçük harfli kafa farklıdır HEAD. Cevabım bunu biraz açıklığa kavuşturuyor.
Cascabel

7
@ e-satis: Bu normal ifade değil. ^Geçerli bir önce taahhüt var - "önce taahhüt" için sadece seyahatseverlerin Git adlı bir nottur. (Eğer akım bir birleştirme ise, ilk ebeveyni kullanır.)
Cascabel

1
@ e-satis: Taahhütleri belirtmenin tüm yolları hakkında daha fazla bilgi için git-rev-list için kılavuz sayfanın belirleme bölümlerine bakın - bu sadece küçük bir parça. kernel.org/pub/software/scm/git/docs/…
Cascabel

1
Hayır, devir ve HEAD aynı taahhüdü işaret ettiklerinde, hiçbir fark yoktur. Ve devir veya HEAD yerine komut kimliğini (SHA-1 değeri) bile yazabilirsiniz. Ve değil taciz bize sorular :) ile ilgisi, merak etmeyin (me en azından: P)
dürtmek

87

HEAD şu anda teslim alınmış taahhüdüne bir ref (referans).

Normal durumlarda, aslında kontrol ettiğiniz şubeye sembolik bir ref - .git / HEAD içeriğine bakarsanız "ref: refs / heads / master" gibi bir şey görürsünüz. Şubenin kendisi, şubenin ucundaki taahhüde bir referanstır. Bu nedenle, normal durumda, HEADmevcut dalın ucundaki taahhüdü etkili bir şekilde ifade eder.

Ayrıca "bağımsız bir KAFA" olması da mümkündür. Bu, uzak bir dal, belirli bir taahhüt veya etiket gibi (yerel) bir dalın yanı sıra bir şeylere baktığınızda olur. Bunu görmek için en yaygın yer, bir taahhüdü düzenlemeyi seçtiğinizde etkileşimli bir yeniden pazarlama sırasındadır. Müstakil HEAD durumunda, HEAD bir taahhüt için doğrudan bir referanstır. .Git / HEAD içeriği bir SHA1 karması olacaktır.

Genel olarak konuşursak, HEAD "ne kontrol ettiniz" anlamına gelen uygun bir isimdir ve bu konuda fazla endişelenmenize gerek yoktur. Ne yaptığınıza dikkat edin ve ne yaptığınızı bilmediğiniz sürece (örneğin, etkileşimli bir rebase içindeyseniz) bir şubede değilseniz (müstakil HEAD durumu) taahhüt etmek istemediğinizi unutmayın. .


6
Bu anlamadığım bir şey. Uzak bir şubeye ödeme yaparsanız, neden bir "müstakil KAFA" ile sonuçlanırsınız. Neden yerel deponuzda uzaktan kumandanıza karşılık gelen şubeye otomatik olarak atlamıyorsunuz?
e-satis

3
@ e-satis: Yerel şubeyi istiyorsanız, yerel şubeye göz atın. İkisinin mutlaka aynı olmadığını unutmayın - yerel olana uzak olanı birleştirmesini (veya çekmesini) söylemelisiniz. İzleme sadece sorduğunuzda hangisinin otomatik olarak çekileceğini bilir. Ayrılmasının nedeni, uzak dalın, uzak depodaki dalın son görülen konumuna bir işaretçi olarak tasarlanmasıdır. Taahhüt etmeye çalışırsanız, uzak repo değişmez, bu nedenle uzak şube de değişmemelidir.
Cascabel

1
Tamam, bunu elde edemedim: bir şekilde yerel bir şubeye sahip olmak, uzak olanla aynı olduğu anlamına gelmez. Başlangıçta almak gerçekten zor çünkü ben bir SVN arka plan geliyor :-) Teşekkürler adamım. BTW, başsız bir KAFAYI yerel bir şubeye nasıl taşıyacaksınız?
e-satis

3
@ e-satis: Genel cevap git rebase <branch> HEAD. Bu son ortak atası bulacaksınız <branch>ve HEADve sonra oradan tüm kaydedilmesini almak HEADüzerine (onları rebase) onları ve uygulamak <branch>. Bunu aslında yamalar olarak uygulayarak yapar, bu yüzden iki dal gerçekten farklıysa, çatışmalar olabilir. Ama eğer <branch>bir atasaysanız HEAD(yani doğru HEADyerdeyseniz, sadece müstakil olduğunuzu unutmuştunuz ), rebase sadece hızlı bir birleşimdir.
Cascabel

3
Bu, bir süre aradıktan sonra gördüğüm git HEAD'in en açık ve doğru açıklamalarından biridir.
LarsH

21

Hep daha HEAD~5önce 5 taahhüt GO demek düşündüm . Ancak komutun GO kısmını taşımıyor. Komutun yalnızca referansı / 'nereye yapılır' kısmını taşır .

Layman terimleriyle şu soruya cevap vermek için kullanılır: NEREYE GİTMELİYİM ? Hangi taahhüde?

  • HEAD mevcut taahhüt anlamına gelir
  • HEAD~1 önce 1 taahhüt anlamına gelir
  • HEAD~ AYRICA önce 1 taahhüt (referans) anlamına gelir
  • HEAD~87 87 (referans)

Kullanımı:

  • git checkout HEAD~1 aslında önce 1 taahhüt / referans GO / checkout
  • git reset HEAD~3 son 3 taahhüdünüzü kaldıracaktır - değişiklikleri kaldırmadan, yani son 3 taahhütte yapılan tüm değişiklikleri birlikte görebilir, sevmediğiniz veya eklemediğiniz şeyleri kaldırabilir ve sonra tekrar taahhüt edebilirsiniz.
  • git reset --hard HEAD~3son taahhüdünüzü kaldıracak ve değişikliklerini kaldıracaktır . Bu değişiklikleri tamamen kaldıracaktır. Daha fazla bilgi için buraya bakın .
  • git diff HEAD~3 son 3 işlemdeki değişiklikleri kontrol etmek için

3
kendi
Tatlım

15

Git'teki HEAD işaretçisi

Git, HEAD adlı bir referans değişkeni tutar. Ve biz bu değişkeni bir işaretçi olarak adlandırırız, çünkü amacı depodaki belirli bir işleme başvurmak veya işaret etmektir. Yeni taahhütlerde bulundukça, işaretçi değişecek veya yeni bir taahhüdün üzerine gelecektir. HEAD daima depomuzdaki mevcut dalın ucuna işaret eder. Şimdi, bunun evreleme dizinimizle veya çalışma dizinimizle değil havuzumuzla ilgisi vardır.

Bunu düşünmenin başka bir yolu, depomuzun son durumu veya en son kontrol edilen şeydir ve deponun kaldığı yer veya son durum olduğu için, HEAD'in bir sonraki taahhüdün ebeveynine işaret ettiğini veya taahhüt yazımının yapılacağı yer.

Bunu düşünmek için iyi bir metafor, kaset kayıt cihazında çalma ve kayıt kafası. Ses kaydetmeye başladığımızda, kaset başın ötesine geçer ve üzerine kayıt yapar. Bu kayıt kafasının durduğu yeri Durdur'a bastığımızda, ikinci kez Kaydet'e bastığımızda tekrar kaydetmeye başlayacağı yerdir. Record'a tekrar bastığımızda kayıt yapmaya başlayacağımız yer burası.

Git'teki HEAD işaretçisi çok benzer, bir sonraki kayda başlayacağımız yeri gösterir. Yaptığımız şeyler için depomuzda bıraktığımız yer burası.


0

Basit bir ifadeyle, HEAD, şu anda check-out şubesindeki son taahhüt için bir referanstır.

HEAD'ı "mevcut şube" olarak düşünün. Git checkout ile şubeleri değiştirdiğinizde, HEAD revizyonu yeni şubenin ucunu gösterecek şekilde değişir.

HEAD'in neyi işaret ettiğini görebilirsiniz:

cat .git/HEAD

HEAD'ın bir şube adıyla ilişkili olmayan belirli bir düzeltmeye başvurması mümkündür. Bu duruma müstakil KAFA denir.

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.