Özellik dalını başka bir özellik dalına yeniden oluştur


305

Üzerinde çalıştığım iki (özel) özellik dalım var.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Bu dallar üzerinde biraz çalıştıktan sonra Branch1'deki Branch2'deki değişikliklere ihtiyacım olduğunu keşfettim. Branch2'deki değişiklikleri Branch1'e yeniden eklemek istiyorum. Son olarak aşağıdakileri yapmak istiyorum:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Ben çok emin ben ikinci şubesini rebase gerek üzerine ilk, ama ben teslim olması gereken doğru sözdizimi ve hangi şube hakkında tamamen emin değilim.

Bu komut istenen sonucu verecek mi?

(Branch1)$ git rebase --onto Branch1 Branch2

11
Sorunuzu cevaplamak için bir test deposu oluşturacağım, gösterdiğiniz taahhüt yapısını oluşturacağım ve gösterdiğiniz komutu deneyeceğim. Ama bunu kendiniz yapabileceğinizi düşünüyorum, bu yüzden yapmayacağım :)
Daniel Hilgarth

3
Teşekkürler. Bunu ilk kez doğru bir şekilde elde etmem o kadar eğildi ki, kendimi kolayca test edebileceğim bana olmadı :-)
Arjen

4
Ben de öyle düşünmüştüm, bu yüzden bu yorumu yayınladım :) Ne zaman bir şey yapsam, düşündüğüm şeyi yapacağından emin değilim, bir test deposu oluşturuyorum ve testlerimi orada yapıyorum. Ya da, gerçek depomun bir kopyasını oluşturuyorum ve kopya üzerinde testler yapıyorum.
Daniel Hilgarth

Not: Git 2.0 rebase bu tür bir kısayol tanıtacak: git rebase -. bkz aşağıda Cevabımı
VonC

5
Küçük not: Buradaki yanıtlar sonuç olarak branş2'yi vermektedir. OP şube istedi1. Yoksa bir şey mi kaçırdım?
Josef.B

Yanıtlar:


353
  1. Şube2'ye geç

    git checkout Branch2
    
  2. Geçerli (Branch2) değişiklikleri Branch1 değişikliklerinin üzerine, Branch2'de kalarak uygulayın:

    git rebase Branch1
    

Bu da sizi Branch2'de istenen sonuca bırakacaktır:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Şube1'i silebilirsiniz.


Teşekkürler! Yeniden temellendirdikten sonra şubeyi silerken, şubenin tam olarak birleştirilmediğine dair bir mesaj alıyorum. Bu iletiyi güvenle yok sayabilir ve silmeyi zorlayabilirim?
Arjen

10
Branch1'deki tüm değişikliklere sahip olmak istemedi mi?
tomasz_kusmierczyk

6
Bu onun istediğinin tam tersi gibi görünüyor, değil mi?
1252748

1
Gerçekten de @tomasz_kusmierczyk ve @ 1252748 ve ben de kafam karıştı. Ama sonra git rebaseBranch1'de kalırken performansın Branch1 tarihini yeniden yazacağını fark ettim ve Branch1'in Branch2'den kopyalananların üstünde değişiklik yapmasını sağladım. Bu, aşağıdaki taahhüt sırasına neden olacaktır a - b - f - g - c' - d' - e'.
eel ghEEz

1
@tomasz_kusmierczyk ve 1252748, bu istediği şeyin tam tersi değil, tam olarak istediği bu. Şube adları önemli değil, her zaman değiştirebilirsiniz.
a3y3

56

Not: Branch1Çalışmışsanız Git 2.0 (2.Ç 2014) ile şunları yazabileceksiniz:

git checkout Branch2
git rebase -

Bkz 4f40740 taahhüt tarafından Brian Gesiakmodocache :

rebase: " -" önceki dal için kısa el "e izin ver

Teach ile aynı steno rebase checkoutve mergekarşı dalı isim rebasegeçerli dal üzerinde; yani " -" daha önce bulunduğumuz şube "anlamına gelir.


26
güzel, ama aynı zamanda biraz tehlikeli. bazen ayrıntılar kazanır. ama sonra tekrar, Java'yı da severim ... (-:
sthzg

3

Rebase'i istediğini biliyorum, ama bunun yerine Branch2'den Branch1'e taşımak istediğim taahhütleri Cherry-Pick olurdu. Bu şekilde, hangi dalın ustadan ne zaman oluşturulduğuna dikkat etmem gerekmeyecekti ve birleştirme üzerinde daha fazla kontrolüm olacaktı.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
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.