Cabang fitur rebase ke cabang fitur lain

305

Saya memiliki dua cabang fitur (pribadi) yang sedang saya kerjakan.

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

Setelah mengerjakan beberapa cabang ini, saya menemukan bahwa saya memerlukan perubahan dari Branch2 di Branch1. Saya ingin mengubah perubahan Branch2 ke Branch1. Saya ingin mengakhiri dengan yang berikut ini:

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

Saya cukup yakin saya harus mengubah cabang kedua menjadi yang pertama, tetapi saya tidak sepenuhnya yakin tentang sintaks yang benar dan cabang mana yang seharusnya saya periksa.

Akankah perintah ini menghasilkan hasil yang diinginkan?

(Branch1)$ git rebase --onto Branch1 Branch2
Arjen
sumber
11
Untuk menjawab pertanyaan Anda, saya akan membuat repositori tes, buat struktur komit yang Anda perlihatkan dan coba perintah yang Anda perlihatkan. Tapi saya pikir Anda bisa melakukannya sendiri, jadi saya tidak akan melakukannya :)
Daniel Hilgarth
3
Terima kasih. Saya sangat ingin mendapatkan ini dengan benar pertama kali sehingga tidak terpikir oleh saya bahwa saya dapat dengan mudah menguji ini sendiri :-)
Arjen
4
Saya pikir begitu, itu sebabnya saya memposting komentar itu :) Setiap kali saya melakukan sesuatu, saya tidak yakin itu akan melakukan apa yang saya pikirkan, saya membuat repositori tes dan melakukan tes saya di sana. Atau, saya membuat salinan repositori saya yang sebenarnya dan melakukan tes pada salinan itu.
Daniel Hilgarth
Catatan: Git 2.0 akan memperkenalkan shortcut untuk jenis rebase: git rebase -. lihat jawaban saya di bawah ini
VonC
5
Catatan kecil: Jawaban di sini memberikan branch2 sebagai hasilnya. OP menginginkan branch1. Atau saya melewatkan sesuatu?
Josef.B

Jawaban:

353
  1. Beralih ke Branch2

    git checkout Branch2
    
  2. Terapkan perubahan saat ini (Branch2) di atas perubahan Branch1, tetap di Branch2:

    git rebase Branch1
    

Yang akan memberi Anda hasil yang diinginkan di Branch2:

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

Anda dapat menghapus Branch1.

sasikt
sumber
Terima kasih! Saat menghapus cabang setelah rebasing saya mendapatkan pesan bahwa cabang tidak sepenuhnya digabung. Saya menganggap saya dapat dengan aman mengabaikan pesan ini dan memaksanya menghapus?
Arjen
10
bukankah dia ingin memiliki semua perubahan di Branch1?
tomasz_kusmierczyk
6
Ini sepertinya kebalikan dari apa yang dia inginkan, bukan?
1252748
1
Memang, @tomasz_kusmierczyk dan @ 1252748, dan saya juga bingung. Tapi kemudian saya menyadari bahwa tampil git rebasesambil tetap di Branch1 akan menulis ulang sejarah Branch1 untuk memiliki perubahan Branch1 di atas semua yang disalin dari Branch2. Itu akan menghasilkan perintah komit berikut a - b - f - g - c' - d' - e',.
belut ghEEz
1
@tomasz_kusmierczyk dan 1252748, ini bukan kebalikan dari apa yang dia inginkan, ini PERSIS apa yang dia inginkan. Nama cabang tidak masalah, Anda selalu dapat mengubahnya.
a3y3
56

Catatan: jika Anda aktif Branch1, Anda akan dengan Git 2.0 (Q2 2014) dapat mengetik:

git checkout Branch2
git rebase -

Lihat komit 4f40740 oleh Brian Gesiakmodocache :

rebase: izinkan " -" kependekan dari cabang sebelumnya

Ajarkan rebeno dengan steno yang sama dengan checkoutdan mergeuntuk menamai cabang ke rebasecabang saat ini; yaitu, bahwa " -" berarti "cabang tempat kami sebelumnya".

VONC
sumber
26
bagus, tetapi juga agak berbahaya. terkadang verbosity menang. tapi sekali lagi, saya juga suka Java ... (-:
sthzg
3

Saya tahu Anda diminta untuk Rebase, tapi saya akan Cherry-Pilih komitmen saya ingin pindah dari Branch2 ke Branch1 sebagai gantinya. Dengan begitu, saya tidak perlu peduli ketika cabang mana yang dibuat dari master, dan saya akan memiliki lebih banyak kontrol atas penggabungan.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Craigo
sumber