Git - yanlış dal üzerinde çalışıyor - değişiklikleri mevcut konu dalına kopyalama


333

Bir proje üzerinde çalışıyordum, ancak maalesef şubeme geçmeyi unuttum ve bu yüzden usta üzerinde çalışıyorum

Burada yaptığım işi (3 dosya) master'dan, master'a geçmeden şubeme (örneğin branch123 olarak adlandırılır ) nasıl kopyalayabilirim?

Yanıtlar:


540

İhtiyacınız olan tek şey şu şekilde:

git stash
git checkout branch123
git stash apply

O zaman ana dala dokunmadan kendi dalına geri dönmelisin.


6
ok- ben koştu, ama ben master (git checkout master) ve git durumunu çalıştırmak, aynı dosyalar hala "değiştirilmiş" - bu beklenen mi?
Alex

5
Geçerli dalınız (ana) ile konu dalı (dal123) arasındaki farklar, yerel olarak değiştirdiğiniz dosyalardan hiçbirinde değilse, saklamak zorunda kalmayabilirsiniz. Git, bu durumda konu dalına göz atmanıza izin verecektir.
Cascabel

3
@Alex: Evet, bu bekleniyor. Bu taahhütleri içermez. stashyerel değişiklikleri kaydeder, sonra stash applygeri getirir.
Cascabel

6
Onları ana daldan nasıl "kurtarabilirim" .. bunu temiz bırakmak için?
Alex

7
git reset --hard HEADve ana dalınıza yaptığınız son işe geri döndünüz.
gnab

46

Kabul edilen cevap en kapsamlı olanıdır, ancak basitleştirebileceğiniz özel bir durum vardır. Eğer çalışma dizininde değiştirilmiş dosyalar hem de aynıysa masterve branch123sadece yapabileceği

git checkout branch123

Herhangi bir şeyi saklamanıza gerek yoktur, çünkü varsayılan davranışı checkoutçalışma dizininizdeki değiştirilmiş dosyaların üzerine DEĞİL yazmaktır, böylece hiçbir şey kaybetmezsiniz. (Bu aslında Cascabel tarafından yapılan yorumlarda belirtilmiştir)

Diğer insanların yorumlarda belirttiği gibi, branch123henüz mevcut değilse,

git checkout -b branch123

Burada bulduğum şeye dayanarak .


3
Veya yeni bir şube oluşturmak istiyorsanız,git checkout -b newbranch
Phil Mitchell

2
Bu benim için saklamaktan daha iyi çalışıyor ve çok daha kolay. Teşekkürler!
Matthias

31
Hayır, bu işe yaramıyor. Git size şu iletiyi gösterir: "şubeleri değiştirmeden önce değişikliklerinizi yapın veya saklayın."
dsharew

1
@DegenSharew: Evet, bazı durumlarda haklısınız, yani çalışma dizininde değiştirdiğiniz dosyalar masterve ile aynı değilse branch123. Düzenlenmiş cevabımı görün.
Russel Dirks

1
Bu benim için harika çalıştı. Henüz bir şube yapmadım, bu yüzden yaptım: git checkout -b newbranchname. Değişikliklerim o dalda kendi başlarına ortaya çıktı.
dex3703


0

Yeni bir şube oluşturmak mümkün olduğundan, ancak dosyaları teslim alırken mevcut bir şubeyi kontrol etmek mümkün olmadığından, çalışmak için geçici bir şube kullanarak aşağıdaki numarayı buldum:

Bu senaryo en azından VS 2015 Git eklentisi ile çalışır, ancak büyük olasılıkla herhangi bir git aracıyla çalışır.

  1. kullanıma alma ve master'daki dosyalarda değişiklik yapma (ups !, yanlış şube)
  2. master'dan yeni bir dal "temp" (veya seçtiğiniz herhangi bir kullanılmayan ad) oluşturun. Teslim alınan dosyalar artık ana olarak değil geçici olarak teslim edilecektir.
  3. temp'taki değişiklikleri kontrol et (master'a dokunulmaz)
  4. Şimdi her şey kontrol edildi ve mevcut bir şubeyi kontrol etmek mümkün. İstenen şubeye göz atın (değişiklikleri yapmak istediğim şubeye) 3.5 Git Rebase
  5. temp'i aranan dalla birleştir. Şimdi değişiklikler doğru dalda.
  6. Artık gerekmediği için geçici dalı silin

EDIT: Birleştirme işleminden önce geçici şube bir rebase (git rebase --onto) yapmak zorunda olduğunu öğrendim. Aksi takdirde, master'daki değişiklikler birleştirmeye dahil edilir. Ekstra 3.5 adım yukarıda. Rebase hakkında daha fazla bilgiye buradan ulaşabilirsiniz: https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

Geri bildiriminiz için teşekkürler. Ancak çözüm oldukça basittir ve stash yerine geçici bir dal kullanılması dışında "stash" çözeltisiyle aynı prensibi izler.
Stash
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.