Git repo'm neden kopuk bir KAFA durumuna girdi?


387

Bugün müstakil bir kafa ile sonuçlandım, aynı sorun şöyle açıklandı: git push, yerel değişikliklerim olsa bile her şeyi güncel söylüyor

Bildiğim kadarıyla olağan dışı bir şey yapmadım, sadece yerel repodan taahhüt eder ve iter.

Peki nasıl bir a ile sonuçlandım detached HEAD?


18
Uzak bir şubeye göz atmak, bunu yanlışlıkla yapmanın en yaygın yolu gibi görünüyor; diğer bir yaygın yol, branch-name@{n}n. önceki konumunu kontrol etmektir branch-name. Ama ne olursa olsun, bir noktada bir olmalıydı git checkout <rev>. Bu bir zil çalmazsa, muhtemelen Will'in bahsettiği şeyi yaptınız - yapmaya çalıştı git checkout <file>ve kazayla bir revizyon belirtmeyi başardı.
Cascabel

3
Ayrılmış bir KAFA durumunu geri almak için bkz. Git ayrılmış bir kafa düzeltilsin mi? .

Reporum bu durumda, yeniden basma sırasında çatışmalarla karşılaşıldığında sona erdi. Neyse ki Git koştuğumda ne yapacağımı söyledi git status:all conflicts fixed: run "git rebase --continue"
Paul

2
Ayrıca yanlışlıkla veya git checkout remotes/origin/my-branchyerine yazdığınızda da olur . git checkout my-branchgit checkout origin/my-branch
Adam Libuša

@adam Libusa, Teşekkürler benim için çalıştı. Git checkout uzaktan kumandaları / origin / my-branch ve git checkout my-branch arasındaki fark nedir? Aynı değil mi. ama söylediklerim benim için çalıştı. Merak ediyorum merak ediyorum.
karunakar bhogyari

Yanıtlar:


281

Bir Herhangi çıkış o birinin adı değil işlemek için size müstakil HEAD alacak dalları. Bir dalın ucunu temsil eden bir SHA1 hala kopuk bir KAFA verir. Yalnızca yerel bir şube adının kullanıma alınması bu modu önler.

Müstakil bir KAFA ile çalışmayı görün

HEAD ayrıldığında, adlandırılmış bir dal güncellenmemesi dışında normal gibi çalışır. (Bunu isimsiz bir şube olarak düşünebilirsiniz.)

alternatif metin

Örneğin, bir "uzak dalı" önce izlemeden teslim alırsanız, ayrı bir KAFA ile karşılaşabilirsiniz.

Bkz kafasını sökülmeden anahtarı dalı: git


Git 2.23 (Ağustos 2019) ile artık kafa karıştırıcı git checkoutkomutu kullanmak zorunda değilsiniz .

git switch ayrıca bir şubeyi kontrol edebilir ve bir KAFA alabilir, aşağıdakiler hariç:

  • açık bir --detachseçeneği var

HEAD~3Yeni bir şube oluşturmadan geçici muayene veya deneme taahhüdünü kontrol etmek için:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • uzaktan izleme dalını yanlışlıkla ayıramaz

Görmek:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

Vs. yeni git switchkomutu kullanarak :

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

Uzak bir dalı izleyen yeni bir yerel şube oluşturmak istiyorsanız:

git switch <branch> 

Eğer <branch>buldum ama uzaktan tam birinde bir izleme dalı var orada yok değil (diyoruz <remote>eşdeğeri olarak eşleşen bir isim, tedavi ile)

git switch -c <branch> --track <remote>/<branch>

Artık hata yok!
Artık istenmeyen müstakil KAFA!


12
Ayrılmış kafa durumuna girmenin bir başka yolu, etkileşimli bir tabanın ortasındaysanız ve taahhütlerden birini düzenlemek istiyorsanız. Git sizi düzenleme taahhüdüne bıraktığında, rebase'i bitirinceye kadar müstakil bir durumda olacaksınız.

Bu görsel kılavuzda şu açıklama var: git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage."Dosyalar sahneye kopyalanıyor" ne anlama geliyor? Dosyaların işlendiğini sanıyordum, yani sahne temizlendi mi?
fazla

16
Aslında, bir dalın ucunda olsun ya da olmasın , SHA1 tarafından herhangi bir taahhütte bulunduğunuzda müstakil bir KAFA alacaksınız ; müstakil bir HEAD almadan ödeme yapabileceğiniz tek şey bir şube adıdır. Örneğin, yukarıdaki şemada olmasına rağmen master, size müstakil bir KAFA verecek, ancak olmayacak. ed489git checkout ed489git checkout master
musiphil

8
"You can think of this as an anonymous branch":) Ben benzetmeyi seviyorum
Adrien Be


117

Bunu şimdi kazara çoğalttım:

  1. uzak dalları listeler

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. Yerel olarak bir tane kontrol etmek istiyorum, bu yüzden macunu kestim:

    git checkout origin/Feature/f1234
    
  3. Presto! Müstakil HEAD durumu

    You are in 'detached HEAD' state. [...])
    

Çözüm # 1:

origin/Kontrol ederken benim şube spesifikasyonumun önüne dahil etmeyin :

git checkout Feature/f1234

Çözüm # 2:

-bUzaktan kumandadan yerel bir dal oluşturan parametre ekle

git checkout -b origin/Feature/f1234 veya

git checkout -b Feature/f1234 otomatik olarak başlangıç ​​noktasına geri dönecek


14
Bu neredeyse harika bir cevap, ancak neden kopuk bir kafa durumuna girdiğinizi açıklayamıyor.
Kaz,

5
Katılıyorum ama aradığım çözümü sağlıyor. Teşekkürler!!
17'de Kilmazing

Bu gördüğümüz diğer cevap olduğunu git checkout -b Feature/f1234<=> git branch Feature/f1234ve git checkout Feature/f1234.
Armfoot

1
varsayılan olarak köken bakar, bu yüzden verdiğinizde origin/branchname, origin/origin/branchnameilkinin kullandığınız uzak ad olduğunu söylemek ister -b, eğer u yoksa anonymous, ayrılmış bir dal oluşturur . Benzer şekilde farklı bir uzaktan kumandadan kontrol etmek için -bparametreden bahsetmeniz gerekir, aksi takdirde git yeni bir uzaktan kumandadan olduğunu bilmenin bir yolu yoktur, arayacaktır origin/remote/branchname.
garg10may

Sen bir azizsin!
Harvey Lin

12

Deneyin

git reflog 

bu size KAFA ve şube işaretçilerinizin geçmişte nasıl hareket ettiği hakkında bir geçmiş sunar.

Örneğin :

88ea06b HEAD @ {0}: ödeme: DEVELOPMENT'dan uzaktan kumanda / orijin / SomeNiceFeature e47bf80 HEAD @ {1}: başlangıç ​​orijini GELİŞTİRME: Hızlı ileri sarma

bu listenin başında bir DETACHED HEAD durumuyla karşılaşmanızın bir nedeni var ... bir uzaktan izleme şubesini kontrol etmek.


7

Dosyaları yeniden kontrol ederek ve sözdizimini doğru bir şekilde sağlayarak yaptığınız değişiklikleri geri almaya çalışırsanız kolayca olabilir.

Çıktına bakabilirsiniz git log- son başarılı işlemden bu yana kütüğün kuyruğunu buraya yapıştırabilirsiniz ve hepimiz ne yaptığınızı görebiliriz. Ya da yapıştırabilir ve #gitIRC'de güzel bir şekilde sorabilirsiniz .


5

Şube ile aynı adlı bir etiketiniz varsa olabilir.

Örnek: "release / 0.1" etiket adı ise, o zaman

git checkout release/0.1

"bırakma / 0,1" de bağımsız HEAD üretir. Release / 0.1'in bir şube adı olmasını beklerseniz, kafanız karışır.


1
Evet. Ama bunu nasıl düzeltirsin? Şubeyi nasıl kontrol ediyorsunuz?
Martin

5

Detached HEAD şu anda kullanıma alınmış olanın yerel bir şube olmadığı anlamına gelir.

Bir Detached HEADduruma yol açacak bazı senaryolar :

  • Uzak bir şubeye ödeme yaparsanız , deyin origin/master. Bu salt okunur bir daldır. Oluştururken gelen Böylece, bir taahhüt origin/masteröyle olacak kayan serbest , yani herhangi bir şubesine bağlı değil.

  • Belirli bir etiketi veya taahhüdü kontrol ederseniz . Buradan yeni bir taahhütte bulunurken, tekrar serbest kayan olacak , yani herhangi bir şubeye bağlı olmayacak. Bir şube kullanıma alındığında , yeni taahhütlerin her zaman otomatik olarak uca yerleştirildiğini unutmayın.

    Geri dönüp oradan çalışmaya başlamak için belirli bir taahhüdü veya etiketi kontrol etmek istediğinizde, söz konusu taahhütten kaynaklanan yeni bir şube oluşturabilir ve buna geçebilirsiniz git checkout -b new_branch_name. Bu, Detached HEADşimdi bir taahhüt değil bir şubeyi kontrol ettiğiniz için durumu önleyecektir .


3

Basit bir tesadüfi yol git checkout headbir yazım hatası olarak yapmaktır HEAD.

Bunu dene:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

hangi verir

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme


@VonC: bu bağlantı için teşekkürler. Bir Git eğitimi hazırlıyorum ve neden bazen bu kadar kafa karıştırıcı olduğunu belirtmek istiyorum. Zaten bir sürü örnek var (gibi checkout -bbir ödeme gibi görünüyor ama aslında dalları) ama başka bir liste sadece açığız.
Thomas Weller

2

Git ayrık bir kafa durumuna geçmenin diğer yolu, uzak bir dal yapmaya çalışmaktır. Gibi bir şey:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

Bunu yaparsanız, çıkış yeri / foo'yu kontrol etmeye yönelik başka bir girişimin sizi ayrı bir kafa durumuna geri döndüreceğini unutmayın!

Çözüm, orijin / foo'yu izleyen ve sonra isteğe bağlı olarak iten kendi yerel foo şubenizi oluşturmaktır.

Bunun muhtemelen orijinal sorununuzla ilgisi yoktur, ancak bu sayfa "git müstakil kafa" için google hitlerinde yüksektir ve bu senaryo ciddi şekilde belgelenmemiştir.


Bu durum, Owen'in yukarıdaki cevabından bahsettiği şey gibi görünüyor - "orijin / foo" nun kesilmesi ve yapıştırılması git'in bunu "orijin / orijin / foo" olarak düşünmesini sağlıyor.
mvanle

1

Bir taahhüde git checkout <commit-hash>veya uzak bir şubeye ödeme yaptığınızda , HEAD kopar ve üzerinde yeni bir taahhüt oluşturmaya çalışır.

Herhangi bir şube veya etiket tarafından ulaşılamayan taahhütler, 30 gün sonra toplanacak ve depodan çıkarılacaktır.

Bunu çözmenin bir başka yolu, yeni oluşturulan taahhüt ve ödeme için yeni bir şube oluşturmaktır. git checkout -b <branch-name> <commit-hash>

Bu makalede, ayrılmış HEAD durumuna nasıl ulaşabileceğiniz gösterilmektedir .

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.