Git etiketini kontrol etmek, "ayrılmış HEAD durumu" na yol açar


167

Git projem için bir dağıtım komut dosyası geliştiriyorum ve yeni etiketleri kullanmaya başladım. Yeni bir etiket ekledim v2.0:

git tag -a v2.0 -m "Launching version 2.0"

Ve bu etiketi uzak depoya ittim

git push --tags

Dağıtım komut dosyasını yürütmeye ve v2.0etikete bakmaya çalıştığımda şu iletiyi alıyorum:

'Müstakil KAFA' durumundasınız. Etrafınıza bakabilir, deneysel değişiklikler yapabilir ve bunları yerine getirebilirsiniz ve bu durumda yaptığınız herhangi bir taahhüdü başka bir ödeme yaparak şubeleri etkilemeden atabilirsiniz. Oluşturduğunuz taahhütleri tutmak için yeni bir şube oluşturmak istiyorsanız, bunu (şimdi veya daha sonra) checkout komutuyla -b'yi kullanarak yapabilirsiniz. Örnek: git checkout -b new_branch_name HEAD şu anda

Bu normal mi? Depo limboda çünkü eğer yaparsam:

git branch

Bu çıktıyı alıyorum:

* (no branch)
  master

Bu açıksa üzgünüm ama anlayamadım.


"Dağıtım betiğini çalıştır ve v2.0'a göz at" dediğinizde, kodunuz "git checkout v2.0" gibi mi görünüyor? Sürüm komut dosyamı yenilemeye çalışıyorum ve üretim makinemden "git checkout v2.0" komutunu çalıştırdığımda "hata: pathspec 'v2.0' git olarak bilinen hiçbir dosyayla eşleşmedi." Çalıştırmama rağmen üretimde "git checkout v2.0" yapmadan önce yerel makinemde "git push origin --tags". Ben de "git check --tags" ve "git fetch --tags" "git checkout v2.0" çağırmadan önce üretim üzerinde çalışan denedim ve bu da çalışmıyor ... Ben hala alıyorum hata. Herhangi bir fikir?
John Erck

3
Yukarıdaki yorumu silmek üzereydim, ancak devam ettirmenin başka birine yardımcı olabileceğini düşündüm. "Git checkout v2.0" çalışırken etiket adımda bir TYPO vardı çünkü hata alıyordum. Ancak, yazım hatasıyla ilgili hata, "git checkout v2.0" çalıştırmadan ÖNCE bir yazım hatası OLMADAN, "git fetch --tags" komutunu çalıştırırsanız alacağınız hata ile aynıdır. Yani, sonuçta, benim sorunum, "git fetch --tags" çalıştırmadan ÖNCE, "git checkout v2.0" herhangi bir yazım hatası olmadan çalıştırarak çözüldü. Uf!
John Erck

Güzel, evet önce getir --tags (veya uzaktan kumandadan hepsini çekecek git getirme) yapmanız gerekiyor, böylece git etiketi kontrol edebilir. Üzgünüm, bugün yorumunu gördüm.
Khriz

Yanıtlar:


429

Tamam, önce birkaç terim biraz daha basitleştirildi.

İçinde git, tag(diğer birçok şey gibi) ağaçsu olarak adlandırılan şeydir . Bu, proje tarihinde bir noktaya değinmenin bir yoludur. Treeishes bir etiket, bir taahhüt, bir tarih belirleyici, bir sıralı belirteç veya daha birçok şey olabilir.

Şimdi a branchtıpkı bir etiket gibidir ama hareketlidir. Bir dalda "bulunduğunuzda" ve bir taahhütte bulunduğunuzda, şube, mevcut pozisyonunu belirten yeni taahhüdüne taşınır.

Sizin HEAD"geçerli" olarak kabul edilen bir dalın göstergesidir. Genellikle bir havuzu klonladığınızda, HEADbunun masterkarşılığında bir taahhüdü işaret edeceğini gösterir. Daha sonra böyle bir şey git checkout experimentalyaptığınızda, farklı bir işleme işaret edebilecek şubeye HEADişaret edersiniz experimental.

Şimdi açıklama.

Bir yaptığınızda, a ile git checkout v2.0işaret edilmeyen bir taahhüde geçersiniz branch. HEADŞimdi "müstakil" ve bir dal işaret etmiyor. Şimdi bir taahhütte bulunmaya karar verirseniz (olabildiğince), bu taahhüdü izlemek için güncellenecek bir şube işaretçisi yoktur. Başka bir taahhüde geri dönmek, yaptığınız bu yeni taahhüdü kaybetmenize neden olur. Mesaj size bunu söylüyor.

Genellikle, yapabileceğiniz şey söylemek git checkout -b v2.0-fixes v2.0. Bu, treeish'in v2.0(bu durumda bir etiket) işaret ettiği taahhütte yeni bir şube işaretçisi oluşturacak ve ardından bu HEADnoktanıza gelecektir. Şimdi, taahhüt yaparsanız, onları ( v2.0-fixesşubeyi kullanarak ) izlemek mümkün olacak ve genellikle yaptığınız gibi çalışabilirsiniz. Özellikle v2.0koda bir göz atmak istiyorsanız, yaptığınız işte "yanlış" bir şey yoktur . Bununla birlikte, orada izlemek istediğiniz herhangi bir değişiklik yapmak istiyorsanız, bir şubeye ihtiyacınız olacak.

Git'in tüm DAG modelini anlamak için biraz zaman harcamalısınız. Şaşırtıcı derecede basit ve tüm komutları oldukça net hale getiriyor.


Tamam teşekkürler, kodda herhangi bir değişiklik yapmanıza gerek yok, bu yüzden tamam olduğunu düşünüyorum. Şube oluşturmam gerekmiyor. Çok teşekkürler!
Khriz

1
Bu cevaba ilk kez baktığımda kayboldum ama Git dallanma belgelerini okuduktan sonra: http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is çok daha netti .
mark stiles

3
Mükemmel cevap, ama ben ilişkin ekleyebilirsiniz: "Yaptığınız kesinleştirme bu yeni kaybetmek yapacak başka işlemeye geri geçiş." - Hâlâ taahhüt bulabilirsiniz git refloghakkında bilmek büyük bir komut olan! Çöp toplama işlemi gerçekleşmedikçe, bir taahhüdü kaybetmek "imkansız" gibi görünmektedir.
Dmitry Minkovsky

Referanssız taahhütler bir çöp toplama işlemi ile kaybedilebilir.
Noufal Ibrahim

1
Sayfa düzenini değiştirdikleri için URL yanlış.
jcubic

12

Evet, normal. Bunun nedeni, bir başı olmayan tek bir taahhütte bulunmanızdır. Özellikle (er ya da geç) herhangi bir şubenin başı değildir.

Ancak genellikle bu durumla ilgili bir sorun yoktur. Daha güvenli hissetmenizi sağlarsa, etiketten yeni bir şube oluşturabilirsiniz :)


1
Tamam, bu şekilde tutacağım ... güvenlik zaten abartılıyor;)
Khriz

Noufals cevabında yorumladığınız gibi (daha iyi olanı söylemeliyim;)): Bir şeyi değiştirmediğiniz sürece, endişelenmeniz gereken bir şey yoktur. Ancak, bir şeyi değiştirebileceğinizi varsayarsanız , sadece bir şube oluşturabilirsiniz, çünkü git'te ucuzdurlar ve silebilirsiniz (ve daha sonra yeniden oluşturabilirsiniz).
KingCrunch
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.