Git müstakil kafasını tamir et.


1454

Depomda biraz iş yapıyordum ve bir dosyanın yerel değişiklikler olduğunu fark ettim. Artık onları istemedim, bu yüzden yeni bir kopyasını kontrol edebileceğimi düşünerek dosyayı sildim. Git eşdeğerini yapmak istedim

svn up .

Kullanmak git pullişe yaramadı. Bazı rastgele aramalar beni birisinin tavsiye ettiği bir siteye götürdü

git checkout HEAD^ src/

( srcsilinen dosyayı içeren dizindir).

Şimdi ayrıldım bir kafam var. Bunun ne olduğu hakkında fikrim yok. Nasıl geri alabilirim?


69
git checkout mastersizi ana şubeye geri götürecek. Çalışan kopya değişikliklerini silmek istiyorsanız, büyük olasılıkla yapmak istersiniz git reset --hard.
Abe Voelker


Eğer taahhüt git checkout -- src/
yazı

Şunu deneyin: bağlantı . Kısacasıcreate temp branch - checkout temp branch - checkout master - delete temp branch
fidev

@AbeVoelker Yorumlarda ne demek istediniz working copy changes? Başka bir taahhüdü kontrol ettikten sonra dosyalarda yaptığınız değişikliklerden mi bahsediyorsunuz (örneğin, ayrılmış bir kafa durumundayken yaptığınız değişiklikler)?
Minh Tran

Yanıtlar:


2147

Ayrılmış kafa, artık bir dalda bulunmadığınız anlamına gelir, tarihte tek bir taahhüt kontrol etmişsinizdir (bu durumda HEAD'den önceki taahhüt, yani HEAD ^).

Ayrılmış HEAD ile ilişkili değişikliklerinizi silmek istiyorsanız

Sadece bulunduğunuz şubeyi kontrol etmeniz yeterlidir, örn.

git checkout master

Bir dahaki sefere dosyayı değiştirip dizindeki durumuna geri yüklemek istediğinizde, önce dosyayı silmeyin, sadece

git checkout -- path/to/foo

Bu, foo dosyasını dizinde olduğu duruma geri yükler.

Ayrılmış HEAD ile ilişkili değişikliklerinizi korumak istiyorsanız

  1. Çalıştır git branch tmp- bu, değişikliklerinizi adlı yeni bir şubeye kaydeder tmp.
  2. Çalıştırmak git checkout master
  3. Yaptığınız değişiklikleri dahil etmek istiyorsanız , şubeden masterçalıştırın . Koştuktan sonra dalda olmalısın .git merge tmpmastermastergit checkout master

6
"Bu, foo dosyasını, üzerinde herhangi bir değişiklik yapmadan önceki durumuna geri yükleyecektir." -> dizinde bulunduğu duruma geri yükler - lütfen düzenleyin
Mr_and_Mrs_D

88
Bu hata neden ilk etapta ortaya çıkıyor? Gitmekten nefret ettiğim şeylerden biri bu - zaman zaman tamamen rastgele davranış. Mercurial ile hiç bu kadar problem yaşamadım.
Violet Zürafa

97
@VioletGiraffe Bu ne bir hata ne de rastgele bir şey - daha önceki bir taahhüdü kontrol ettiğinizde deponuzun girdiği durum. "Müstakil Kafa", o noktadan itibaren herhangi bir iş yapmak istiyorsanız bir dal oluşturmak veya işaret etmek isteyebileceğiniz konusunda bir uyarı işlevi görür. Ancak bu etiketi görüntülemek veya işlemek istiyorsanız, bağımsız bir kafa durumunda olmakla ilgili yanlış bir şey yoktur.
Neil Neyman

22
Eğer müstakil kafaya karar verdiyseniz bunu yapmayın, diğer cevaplara bakın. Eğer öyleyse, önceki baş git bahsi geçenPrevious HEAD position was 7426948...
KCD

9
@VioletGiraffe: Mercurial'a dayalı olanların zihinsel bir modeliniz var, ancak Git'i kullanıyorsunuz. Zihinsel modelinizi Git'in modeline uyacak şekilde ayarlamak istemiyorsanız, işler rastgele görünmeye devam edecektir. Sanki VR gözlüğü takılıyken dışarıda dolaşıyorsunuz ve bir uçağı uçurduğunuzu düşünüyorsunuz ama gerçekten karşıdan karşıya geçiyorsunuz. Arabalara çarpacaksın.
iconoclast

477

Kaybetmek istemediğiniz dosyaları değiştirdiyseniz, bunları zorlayabilirsiniz. Onları müstakil modda yaptım ve bundan sonra daha sonra master'a entegre etmek için geçici bir şubeye geçebilirsiniz.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Alıntı:

Ayrılmış bir kafada yapılan taahhüt ile ne yapmalı


27
Bunu tercih edilen çözüm olarak görüyorum - özellikle de tek tek sürümü kontrol ettiğinizde yaptığınız değişiklikleri korumak istiyorsanız.
adswebwork

10
@adswebwork: Katılıyorum. Diğer tüm yanıtlar, önceki bir duruma geri dönmeyi ve ayrılmış kafa durumunda yerel olarak yapılan değişiklikleri kaybetmeyi önerir.
Sk8erPeter

6
neden olmasın git stash? Aklıma ilk gelen şey bu. yeni bir şube oluşturmak aşırıya kaçacak.
yazı

2
ayrıca git rebase my-temporary-workşubeyi silebilirsiniz, git branch -d my-temporary-workböylece ilk etapta doğru şubeyi taahhüt etmiş gibi görünebilirsiniz.
Zoltán

@geekay git stashbu dava için mükemmel bir araç gibi geliyor. Bunu başarmak için önerilen adımlarla bir cevap yazabilir misiniz?
Zoltán

156

Geçici bir dal oluşturmayan bir çözüm.

Bu modda zaten bir şeyi değiştirdiğinizde ve isteğe bağlı olarak değişikliklerinizi kaydetmek istediğinizde ayrılmış HEAD durumundan nasıl çıkılır (“düzeltilir”) :

  1. Saklamak istediğiniz değişiklikleri yapın. Ayrılmış HEAD durumunda yaptığınız değişikliklerden herhangi birini devralmak istiyorsanız, bunları taahhüt edin. Sevmek:

    git commit -a -m "your commit message"
    
  2. Saklamak istemediğiniz değişiklikleri atın. Donanımdan sıfırlama, ayrılmış HEAD durumunda yaptığınız taahhüt edilmemiş değişiklikleri atar:

    git reset --hard
    

    (Bu olmadan, adım 3 başarısız oldu, ayrılmış HEAD'deki değiştirilmemiş taahhüt edilmemiş dosyalar hakkında şikayetçi.)

  3. Şubenizi kontrol edin. Daha önce üzerinde çalıştığınız dalı kontrol ederek ayrılmış HEAD durumundan çıkın, örneğin:

    git checkout master
    
  4. Taahhütlerinizi devralın. Artık, başka bir soruya verdiğim cevapta gösterildiği gibi, müstakil HEAD durumunda yaptığınız taahhütleri kiraz toplama ile devralabilirsiniz .

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

git reset --hardBen memba kaynağı olması ve yerel değişiklikler kaldırılması gerektiğini istiyorum, çünkü tam olarak, ihtiyaç vardı edildi.
Markus Zeller

Harika cevap, bu benim için çalıştı
MGLondon

130

Bağımsız kafa şu anlama gelir:

  1. Artık bir dalda değilsiniz,
  2. Tarihte tek bir taahhütte bulundun

Değişikliğiniz yoksa: Aşağıdaki komutu uygulayarak master'a geçebilirsiniz

  git checkout master

Saklamak istediğiniz değişiklikleriniz varsa:

Ayrılmış bir KAFA durumunda, adlandırılmış bir dal güncellenmemesi dışında normal gibi çalışır. Ana şubeyi taahhüt edilen değişikliklerinizle güncellemek için, bulunduğunuz yerde geçici bir şube yapın (bu şekilde geçici şube müstakil HEAD'de yaptığınız tüm taahhütlü değişikliklere sahip olacaktır), ardından ana şubeye geçin ve geçici şubeyi usta.

git branch  temp
git checkout master
git merge temp

2
mükemmel, sonra şube temp kaldırmak sonra
Davi Menezes

64

İşte bağımsız bir kafamda olduğumu ve zaten bazı değişiklikler yaptığımı fark ettikten sonra yaptığım şey.

Değişiklikleri yaptım.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Taahhüdün karmasını (1fe56ad) hatırladım. Sonra olması gereken şubeyi kontrol ettim.

$ git checkout master
Switched to branch 'master'

Sonunda taahhüt değişikliklerini şubeye uyguladım.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Bunun geçici bir dal oluşturmaktan biraz daha kolay olduğunu düşünüyorum.


2
Cevap bu olmalı. Nuked dosyalarınızı geri alır.
BlindWanderer

2
Evet, bu gerçekten yapılacak en basit şey - bir dahaki sefere web'de arama yapmadan hatırlanacak kadar basit. Taahhüt et, karmayı not et, taahhüt etmek istediğin şubeye geri dön ve git cherry-pick <hash>.
Mason,

Çözüm için teşekkürler. Bu yardımcı oldu. Ayrıca "git push origin master" ı yapmak zorunda olduğumu ekleyebilir miyim, böylece efendim ve orijin / master aynı taahhüdü işaret ediyordu.
turnip424

1
Bu aslında tanius'un cevabıdır (bir yıldan fazla yayınlanmıştır).
Peter Mortensen

Teşekkürler bu neşeli seçim son dekolte kafa değişikliklerini geri almak
Omega Küp

54

Bazı değişiklikler yaptıysanız ve sonra bağımsız bir kafada olduğunuzu fark ederseniz, bunun için basit bir çözüm var: stash -> checkout master -> stash pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # Or for extra safety use 'stash apply' then later 
                      #   after fixing everything do 'stash drop'

Hiçbir şey olmamış gibi, değişmemiş değişikliklerinize ve normal "bağlı" HEAD'e sahip olacaksınız.


2
Bu kötü çocuğu yer imlerine ekledim - geçici bir dal oluşturmayı kaydeder. Bir tedavi çalıştı.
Tim Tyler

1
Git alt modülünü kontrol ettikten sonra üzerinde değişiklik yaptıktan sonra sık sık HEAD durumuna geçiyorum. Değişikliklerimi koruyabilmem için işleri düzeltmek için en iyi ve en kolay çözüm olduğunu düşünüyorum.
user5359531

1
Ayrılmış bir durumda zaten değişiklik yapmışsanız bu işe yaramaz mı?
Danijel

40

Belirli bir taahhüdü kontrol ettiğinizde git, ayrılmış bir kafa durumuna gelirsiniz, yani, çalışma kopyanız artık adlandırılmış bir referansın durumunu ("master" gibi) yansıtmaz. Bu, deponun geçmiş durumunu incelemek için yararlıdır, ancak aslında değişiklikleri geri almaya çalışıyorsanız ne istediğinizi değil.

Belirli bir dosyada değişiklik yaptıysanız ve bunları silmek istiyorsanız, checkoutkomutu şu şekilde kullanabilirsiniz :

git checkout myfile

Bu işlem, taahhüt edilmeyen değişiklikleri atar ve dosyayı geçerli dalınızın başında bulunan duruma geri döndürür. Daha önce yapmış olduğunuz değişiklikleri silmek istiyorsanız, resetkomutu kullanmak isteyebilirsiniz . Örneğin, bu, sonraki değişiklikleri atarak depoyu önceki işlemin durumuna sıfırlar:

git reset --hard HEAD^

Ancak, depoyu başkalarıyla paylaşıyorsanız, a git resetrahatsız edici olabilir (çünkü depo geçmişinin bir bölümünü siler). Daha önce değişiklikleri başkalarıyla paylaştıysanız, genellikle git revertbunun yerine bakmak istersiniz , bu da bir "anti-komisyon" oluşturur - yani, söz konusu değişiklikleri "geri alan" yeni bir taahhüt oluşturur.

Git Kitabında daha fazla ayrıntı var.


1
@ Ralphtheninja'nın cevabında söylediğim gibi, git checkout path/to/fooçatışabilir git checkout some-branch, bu yüzden git checkout -- path/to/foobu çatışmalardan kaçınmak daha iyi olurdu .
Diego Lago

30

HEAD bir göstergedir ve sonuç olarak - doğrudan veya dolaylı olarak - belirli bir taahhüde işaret eder:

Bağlı   HEAD, bazı dallara bağlı olduğu anlamına gelir (yani bir kolu işaret eder).
Müstakil HEAD , herhangi bir şubeye bağlı olmadığı anlamına gelir , yani doğrudan bazı taahhütlere işaret eder.

resim açıklamasını buraya girin

Başka bir deyişle:

  • Doğrudan bir taahhüdü işaret ediyorsa , KAFA ayrılır .
  • Dolaylı olarak bir taahhüdü işaret ediyorsa (yani, bir taahhüde işaret eden bir şubeyi gösterir), HEAD eklenir .

Bağlı / ayrılmış HEAD ile durumları daha iyi anlamak için, yukarıdaki resimlerin dört katına çıkan adımları gösterelim.

Deponun aynı durumu ile başlıyoruz (tüm çeyreklerdeki resimler aynıdır):

resim açıklamasını buraya girin


Şimdi gerçekleştirmek istediğiniz git checkout- tek tek resimlerde farklı hedeflerle (bunların üzerine komutları sadece olduğunu vurgulamak soluklaştırılır olacak bu komutları uygulamak):

resim açıklamasını buraya girin


Bu komutları uyguladıktan sonraki durum budur :

resim açıklamasını buraya girin

Gördüğünüz gibi HEAD , komutun hedefini gösterir git checkout- bir dalı (dörtlüün ilk 3 görüntüsü) veya (doğrudan) bir taahhüdü ( dörtlüün son görüntüsü) gösterir.

Çalışma dizininin içeriği de uygun komuta (enstantane), yani KAFA tarafından işaret edilen komuta (doğrudan veya dolaylı) uygun olacak şekilde değiştirilir.


Şimdi bu cevabın başlangıcındaki durumdayız:

resim açıklamasını buraya girin


6
Okumadım, ama yaptığınız güzel resimler için oy kullandı;).
Carlo Wood

@Carlo, teşekkürler!
MarianD

22

"Müstakil kafa durumu" geçici bir dalda git checkout -bulunduğundan, en son bulunduğunuz dalda olanı kullanın .


1
Dikkatli olun, müstakil durumdayken yaptığınız tüm taahhütleri kaybedersiniz.
Ajak6

@ Ajak6 Bu taahhütleri gerçekten kaybetmiyorsun. Hala kullanılabilirler git reflogve yeni bir şubeye veya git cherry-pickmevcut bir şubeye aktarılabilirler . Bu soruya bakın .
tanius

7

@Philippe Gerber'in cevabını daha da netleştirmek için:

git kiraz toplama

Daha önce cherry-pick, git checkout masterbu durumda a gereklidir. Ayrıca, sadece bir commitin ile gereklidir detached head.


6

ek

Geri dönmek istediğiniz şube yaptığınız son ödeme ise, checkout @{-1} . Bu sizi önceki kasanıza geri götürecektir.

Ayrıca, bu komutu, örneğin bir önceki kasaya geri dönmek için git global --config alias.prevyazmanız yeterlidir git prev.


4

"Ayrılmış kafada olmak", HEAD'in adlandırılmamış belirli bir işleme (adlandırılmış bir şubeye zıt olarak) başvurduğu anlamına gelir (cf: https://git-scm.com/docs/git-checkout bölümü Ayrılmış kafa )

Sorunu çözmek için, yalnızca daha önce tarafından seçilen dalı seçmeniz gerekir.

git checkout @{-1}


2

Bağlantısız bir durumdayken ve yeni dosyalar oluşturduğunuzda, önce bu yeni dosyaların dizine eklendiğinden emin olun, örneğin:

git add .

Ancak yalnızca varolan dosyaları değiştirdiyseniz veya sildiyseniz, aynı anda bir mesaj ekleyebilir (-a) ve bir mesajla (-m) işlem yapabilirsiniz:

git commit -a -m "my adjustment message"

Ardından şu anki durumunuzla yeni bir şube oluşturabilirsiniz:

git checkout -b new_branch_name

Yeni bir şubeniz olacak ve tüm ayarlarınız bu yeni şubede olacak. Daha sonra uzaktan kumandaya ve / veya istediğiniz gibi ödeme / çekme / birleştirme işlemine devam edebilirsiniz.


1

Git bana nasıl yapılacağını söyledi.

yazdıysanız:

git checkout <some-commit_number>

Durumu kaydet

git add .
git commit -m "some message"

Sonra:

 git push origin HEAD:<name-of-remote-branch>

1

Değişikliklerimi korumak istedim, sadece bunu düzeltiyorum ...

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git push TOYOURCURRENTBRANCH

bu benim için çalışıyor


1

Normalde HEADbir dalı gösterir. Bir şubeye işaret etmiyorsa, bunun yerine taahhüt karmasını işaret ettiğinde 69e51, bağımsız bir HEAD'iniz olduğu anlamına gelir. Sorunu çözmek için iki şubeyi işaret etmeniz gerekir. Bunu düzeltmek için iki şey yapabilirsiniz.

  1. git checkout other_branch // Bu işlemde koda ihtiyacınız olduğunda mümkün değil hash
  2. yeni bir şube oluşturun ve taahhüt karmasını yeni oluşturulan şubeye yönlendirin.

HEAD bir kurala işaret etmelidir, altın kuralı bir taahhüt karması değildir.


bu yüzden bu hatayla karşılaştım. Bir revizyona baktım ve daha sonra kafayı düzgün bir şekilde bağlayacak olan şubeye bakmak yerine mevcut / en son revizyona tekrar baktım. Yardım için teşekkürler.
Rahul Thakur

1

Ayrılmış kafa, şubenizi düzgün bir şekilde kontrol etmediğiniz veya tek bir taahhütte bulunduğunuz anlamına gelir.

Böyle bir sorunla karşılaşırsan daha sonra ilk saklamak değişikliklerinizi kaybetmezsiniz böylece yerel değişiklikleri.

Bundan sonra ... komutunu kullanarak istediğiniz şubeye göz atın:

Diyelim ki MyOriginalBranch şubesini istiyorsunuz:

git checkout -b someAd kökenli / MyOriginalBranch


1

muhtemelen yaptın git reset --hard origin/your-branch.

Sadece dene git checkout your-branch


0
git pull origin master

benim için çalıştı. Bu sadece uzak ve şube adını açıkça vermekle ilgiliydi.


0

Benim durumumda, git statuskoştum ve çalışma dizinimde birkaç izlenmemiş dosyam olduğunu gördüm.

Sadece yapmak istediğim rebase'i çalıştırmak için onları temizlemem gerekti (çünkü onlara ihtiyacım yoktu).


0

Bu benim için çalışıyor, müstakil kafa için yeni bir şube atayacak:

git checkout new_branch_name detached_head_garbage_name


0

Ayrılmış HEAD, şu anda herhangi bir şubede bulunmadığınız anlamına gelir. Mevcut değişikliklerinizi tutmak ve yeni bir şube oluşturmak istiyorsanız, yaptığınız şey budur:

git commit -m "your commit message"
git checkout -b new_branch

Daha sonra, potansiyel olarak bu yeni dalı diğer dallarla birleştirmek istersiniz. Git "a dog" komutu her zaman faydalıdır :

git log --all --decorate --oneline --graph
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.