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


280

Git kullanarak böyle bir şey yaptım

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

Bana, müstakil bir kafa durumundayken hala taahhütte bulunabileceğimi söylediğinden, bunu yaptım. Ama şimdi müstakil baş şubemi ve yerel ana şubemi birleştirmek ve daha sonra yaptığım değişikliklerin kökeni / efendisine geçmek istiyorum.

Benim sorum şu ki, ana dalı gerçek durumumla (ayrı kafa) nasıl birleştirebilirim?



Bu durumda bir taahhüt ağacının ekran görüntüsünü ekleyebilirim (bu, ayrılmış bir kafadaki bir taahhüdün aslında gitk veya SourceTree'de nasıl göründüğü), bu soruyu daha da iyi hale getirir.
florisla

Şu anda talihsizlik yapamam ama eğer sağlayabilirseniz, burada gördüğüme sevinirim. Beraberlik olsa bile, daha net hale getirecek
benzen

Yanıtlar:


477

Bulunduğunuz yerde bir şube oluşturun, daha sonra master'a geçin ve birleştirin:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
gelecekte kafaları ayırmaktan nasıl kaçınır?
ycomp

Bunu yaptım ve 5 taahhütle kendimi kökeninin önünde buldum. Bu durumda git push orijini yapıyor musunuz?
Winnemucca

5
garip, "Zaten güncel" alıyorum. geçici işimi birleştirirken
Robert Sinclair

10
"Git branch -d my-tempo-work" ile geçici çalışmamı silmeyi unutmayın
Kaptan Lepton

5
@ ycomp "müstakil kafa" eski bir taahhüdün dosyalarını düzenlediğinizde ve daha sonra şubesi olmayanları bu yeni taahhüde başvurmak üzere taahhüt ettiğinizde olur. Ayrılmış kafayı önlemek için eski taahhütleri kontrol etmeyin. Oradan hala tüm dosyaları istiyorsanız, ancak yeni bir taahhüt olarak, dizinin yerine taahhüt yerine, dizinden ödeme yapabilirsiniz. Bu cevaba bakın
lucidbrot

96

Böyle bir şey yapabilirsiniz.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Daha da basit olurdu

git checkout master
git merge HEAD@{1}

ancak bu, bir hata yaparsanız, ayrılmış kafa üzerinde yapılan taahhütleri kurtarmanın biraz daha zor olabileceği konusunda ufak bir tehlikeye sahiptir.


4
Bunun yıllar sonra olduğunu biliyorum, ama bu cevap için teşekkürler. Kendimi burada kabul edilen cevapla aramayı düşündüm çünkü geçici bir daldan ayrılmak istemedim ve bu cevabın onu silme emri var.
Jeremy Pridemore

8
Komutu kullanmaya karar verirseniz git merge HEAD@{1}, muhtemelen kullanmak istediğiniz komutun bu olduğundan emin olmalısınızgit reflog
Michael Stramel

3
HEAD @ {1} 'i birleştirebilmem, daha önce master'ı önceden kontrol ettiğimden beri hayatımı kurtardı.
juil

garip, "Zaten güncel" alıyorum. tmp birleştirilirken (ancak dosyalar farklıdır)
Robert Sinclair

18

Ben de öyle yaptım:

Temel olarak, adsız detached HEADyeni bir dal olarak düşünün . Bu şubeye diğer tüm şubeler gibi katılabilirsiniz. Taahhüt işlemini tamamladıktan sonra, uzaktan kumandaya itmek istersiniz.

Yapmanız gereken ilk şey buna detached HEADbir isim vermektir . Bunu yaparken kolayca yapabilirsiniz detached HEAD:

git checkout -b some-new-branch

Şimdi diğer dallar gibi uzaktan kumandaya itebilirsiniz.

Benim durumumda, detached HEAD(şimdi some-new-branch) yaptığım taahhütlerle birlikte ustalaşmak için bu şubeyi hızlı ileri sarmak istedim . Tüm yaptığım

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Tabii ki daha sonra birleştirdim master.

Bu kadar.


1
Bu cevap benim için diğerlerinin çalışmadığı yerde çalıştı. git checkout -b new-branchbenim için çalıştı. Diğer öneriler çağrıldı git branch new-branch, ama bu beni hala müstakil kafamda bıraktı ve yeni şube değişikliklerimi yakalamadı.
Jesse Patel

17

Sadece yapabilirsin git merge <commit-number>ya dagit cherry-pick <commit> <commit> ...

Ryan Stewart tarafından önerildiği gibi mevcut HEAD'den bir şube de oluşturabilirsiniz:

git branch brand-name

Veya sadece bir etiket:

git tag tag-name

git rev-parse HEAD
Taahhüt

6

Müstakil HEAD durumunda, adlandırılmış şube güncellenmemesi dışında normal gibi işler yapar. 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üt edilen 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

3

Kolay bir düzeltme sadece kendisine yeni bir taahhüt için şube ve ödemeyi oluşturmaktır: git checkout -b <branch-name> <commit-hash>.

Bu şekilde, yaptığınız tüm değişiklikler söz konusu şubeye kaydedilir. Ana dalınızı artık taahhütlerden temizlemeniz gerekiyorsa, çalıştığınızdan emin olun git reset --hard master.

Bununla, şubelerinizi yeniden yazacaksınız, bu nedenle bu değişikliklerle kimseyi rahatsız etmediğinizden emin olun. Ayrılmış HEAD durumunun daha iyi bir örneği için bu makaleye mutlaka göz atın .


1

Belki en iyi çözüm değil (tarihi yeniden yazacak) ama siz de yapabilirsiniz git reset --hard <hash of detached head commit>.

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.