Git: “Şu anda hiçbir şubede değil.” Değişiklikleri korurken bir şubeye geri dönmenin kolay bir yolu var mı?


202

Bu yüzden depoda biraz iş yaptım ve taahhüt etmek üzereyken şu anda herhangi bir şubede olmadığımı fark ediyorum.

Bu, alt modüllerle çalışırken çok olur ve bunu çözebilirim, ancak süreç sıkıcı ve bunu yapmanın daha kolay bir yolu olması gerektiğini düşünüyorum.

Değişiklikleri korurken bir şubeye geri dönmenin kolay bir yolu var mı?

Yanıtlar:


214

Taahhüt etmediyseniz:

git stash
git checkout some-branch
git stash pop

O zamandan beri hiçbir şey taahhüt ettiyseniz ve değiştirmediyseniz:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Ekstra iş yaptıktan sonra daha fazla iş yaptıysanız:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Daha önce taahhütte bulunduysanız bu yardımcı olmaz. Hiçbir downvote olsa bu soruya belirtilmedi.
Dean Oldukça

24
zaten taahhütte bulunduysanız: yaptığınız taahhüdün karmasını not edin ( git showveya kullanın git rev-parse HEAD), şubeye geçin ve ardından git cherry-picktaahhüt karmasını takip edin.
araqnid

7
Taahhüt varsa, son taahhüdü hash alın. Olmak istediğiniz şubeyi kontrol edin vegit merge _hash_
Daniel

GERÇEKTEN DİKKATLİ OLUN. DEĞİŞİMİ TAAHHÜT ETDİĞİNİZ ve bu adımları izlerseniz ... "Şubeniz ve başlangıç ​​noktanız / ustanız ayrıştı" mesajını görürsünüz.
thinkanotherone

1
@ thinkanotherone Eğer değişikliklerinizi yapmış olsaydınız, saklamak için hiçbir şey olmazdı ve farklı bir dalı kontrol etmek dünyanın sonu değil. Az önce yaptığınız taahhüt hala oradadır ve kullanarak şubeye birleştirebilirsiniz git merge <hash-of-the-commit-you-just-made>.
Erik B

160

bu bana yardımcı oldu

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Zaten birden fazla işlem gerçekleştirdiyseniz, yapmanız gereken budur.
Benjamin Oakes

Denemedim, ama işe yarayacak gibi görünüyor. Ancak, bunun olası bir senaryo olmadığını düşünüyorum. Çoğu insanın taahhütte bulunmadan önce herhangi bir dalda olmadıklarını fark edeceğine ve bunu düzeltmek için kabul edilen cevabı kullanacağına inanıyorum.
Erik B

49
Şaşıracaksınız.
Eric

@ErikB Bir dalda olmama gibi bir şey olduğunu bile bilmiyordum. Bu cevap benim için çok yardımcı oldu.
Konstantin Schubert

2
güzel cevap, aslında sadece bir GIT acemi olarak karşılaşılan hemen hemen her şeyin aksine yazdı ve çalıştı - newbranch'ın rastgele bir isim olduğunu ve bir taahhüt karma ile değiştirilmesi amaçlanmadığını belirtmek isteyebilirsiniz
Toni Leigh

22
git checkout master

Sonuç böyle bir şey:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Öyleyse hadi yapalım:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Ben denemedim, ama iyi çalışır gibi görünüyor. Sanırım git gcbu iki komutu çalıştırmak arasında koşacak olursanız, bu taahhütleri kaybedersiniz, ancak git gcotomatik olarak çalışmıyorsanız bu oldukça risksiz bir yaklaşım olmalıdır. Babay'ın cevabına hala devam ediyorum, ancak kendinizi iki ekstra komut yazmaktan kurtarmak istiyorsanız, sanırım bu yol.
Erik B

Master şubeyi bir noktada bırakmıştım, tam olarak emin değilim. Değişikliklerimi taahhüt etmiştim, efendide değişiklik yoktu. Bu talimatlar ana dalda yaptığım değişiklikleri ve her şeyi güzelleştirdi.
Matti Jokipii

+1 Taahhütleri geride bırakarak başka bir şubeyi kontrol etme konusunda endişeliydim, bu mesajın ona gitmek için güven kattığını gördüm.
J-Dizzle

11

Burada başka bir yoldan ayrılmak

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Birden fazla taahhütte bulunmuş olabilir. Bu durumda babay'ın cevabına bakınız.
Benjamin Oakes

@BenjaminOakes Öyle olabilir, ancak bu git komutları geçerli değildir.
Erik B

@ErikB Kesinlikle doğru. :) babay'ın cevabı, Alex'in yapmaya çalıştığı şeyin geçerli biçimidir.
Benjamin Oakes

9

Alternatif olarak, alt modüllerinizi varsayılan ayrı kafa durumlarında olmak yerine bir dalı kontrol edeceğiniz şekilde ayarlayabilirsiniz.

Eklemek için düzenlendi:

Bunun bir yolu, -b bayrağıyla eklediğinizde alt modülün belirli bir dalını kontrol etmektir:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Başka bir yol, sadece alt modül dizinine girip kontrol etmektir.

git checkout master

1
Bunu nasıl yapacağımı söyleyebilir misin?
Erik B

var olan bir alt modülü bu varsayılan dal modunu güncellemenin bir yolu var mı? gitmodulesbelki güncelleme ?
Hertzel Guinness

@HertzelGuinness Pek değil. Alt modül belirli bir işlem sırasında kontrol edilir. Bir dal, değişebileceği işaret eden sha ve sha işaretçisidir. Bu, kullanıma alınmamış alt modülün durumunu dondurmadığı için yararlı değildir. Alt modülde değişiklik yapıyorsanız, bir dalı kontrol etmek kolaylık sağlar.
Abizern

5

Bu duruma son vermenin bir yolu, uzak bir şubeden bir rebase yapmaktır. Bu durumda, yeni taahhütler işaret edilir, HEADancak masteronlara işaret etmez - diğer dalı yeniden bastırmadan önce nerede olduğunu gösterir.

Bunu masteryaparak bunu yeni bir görev haline getirebilirsiniz :

git branch -f master HEAD
git checkout master

Bu, zorla (üzerine koymadan ) masterişaret edecek şekilde güncellenir .HEADmastermaster


Gerektiği gibi mükemmel çalıştı. Dosyaları zaten sahneledim ve taahhüt ettim, ancak yukarıdaki hata nedeniyle zorlayamadım. Kod iki satır yukarıda mükemmel çalıştı ve benim kod beklendiği gibi itti.
invinciblemuffi

4

Kısa süre önce bu sorunla tekrar karşılaştım. En son alt modüllerle çalıştığımdan ve git hakkında daha fazla bilgi edindikten sonra, taahhüt etmek istediğiniz dalı kontrol etmenin yeterli olduğunu fark ettim. Git saklamasanız bile çalışma ağacını koruyacaktır.

git checkout existing_branch_name

Yeni bir dalda çalışmak istiyorsanız, bunun sizin için çalışması gerekir:

git checkout -b new_branch_name

Çalışma ağacında çakışmalar varsa ödeme başarısız olur, ancak bu oldukça sıra dışı olmalıdır ve eğer gerçekleşirse saklayabilir, patlatabilir ve çatışmayı çözebilirsiniz.

Kabul edilen cevapla karşılaştırıldığında, bu cevap, zaten çalıştırılması gerçekten uzun sürmeyen iki komutun yürütülmesini kurtaracaktır. Bu nedenle, şu anda kabul edilen cevaptan mucizevi bir şekilde daha fazla oy (veya en azından yakın) almadıkça bu yanıtı kabul etmeyeceğim.


2

Aşağıdaki yöntem işe yarayabilir:

git rebase HEAD master
git checkout master

Bu, mevcut HEAD değişikliklerinizi master'ın üstüne yeniden tabanlaştırır. Sonra dalı değiştirebilirsiniz.


Alternatif yol önce şubeyi kontrol etmektir:

git checkout master

Daha sonra Git, ayrılmış taahhütlerinizin SHA1'ini görüntülemelidir, o zaman bunları kiraz olarak seçebilirsiniz, örn.

git cherry-pick YOURSHA1

Veya en sonuncuyu da birleştirebilirsiniz:

git merge YOURSHA1

Farklı şubelerden aldığınız tüm taahhütleri görmek için (emin olun): çalıştırın git reflog.


0

Babay'a 2012'de, birisinin bir dalda ve taahhütte bulunmadıklarının farkına varmayacağını düşündüğümü söylediğimi biliyorum. Bu sadece başıma geldi, bu yüzden sanırım yanıldığımı itiraf etmeliyim, ancak 2016'da bunun başlamam gerektiğini düşünürsek, bunun aslında olası olmadığını iddia edebilirsiniz.

Her neyse, yeni bir şube oluşturmak bence aşırıya kaçmış. Tüm yapman gereken:

git checkout some-branch
git merge commit-sha

Diğer şubeyi kontrol etmeden önce taahhüt dosyasını kopyalamadıysanız, çalıştırarak kolayca bulabilirsiniz:

git reflog

bu bir adam için nadir görülen (olası olmayan) bir konudur. 2012'den bu yana başıma gelmedi. Fakat git-gitme şansını arttırırsan ... Çok muhtemel olacak. Her gün birine olabilir. :)
babay
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.