Aradığınız komut git rebase
, özellikle -i/--interactive
seçenektir.
A dalında commit c'yi bırakmak istediğinizi varsayacağım ve gerçekten birleştirme yerine diğer taahhütleri diğer dallara taşımak istediğinizi kastediyorsunuz, çünkü birleşmeler basittir. A dalını manipüle ederek başlayalım.
git rebase -i <SHA1 of commit a>^ branchA
Bu ^
, önceki kesinleştirme anlamına gelir, bu nedenle bu komut, "a" dan önce yürütmeyi temel olarak kullanarak şube A'yı yeniden temel almayı söyler. Git size bu aralıktaki işlemlerin bir listesini sunacak. Bunları yeniden sıralayın ve git'e uygun olanları ezmesini söyleyin:
pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f
Şimdi tarih şöyle görünmeli:
c - [a+d+e+g] - [b+f] (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
Şimdi, şube B için yeni sıkıştırılmış b + f işlemini alalım.
git checkout branchB
git cherry-pick branchA # cherry-pick one commit, the tip of branchA
Ve aynısı usta için a + d + e + g için:
git checkout master
git cherry-pick branchA^
Son olarak, branchA'yı c'yi gösterecek şekilde güncelleyin:
git branch -f branchA branchA^^
Şimdi sahip olmalıyız:
c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
\
x-x-x-x-x-[b+f] (branchB)
Birden fazla işleminiz varsa, şubeler arasında hareket etmek istiyorsanız, yeniden temellemeyi (etkileşimsiz olarak) tekrar kullanabileceğinizi unutmayın:
# create a temporary branch
git branch fromAtoB branchA
# move branchA back two commits
git branch -f branchA branchA~2
# rebase those two commits onto branchB
git rebase --onto branchB branchA fromAtoB
# merge (fast-forward) these into branchB
git checkout branchB
git merge fromAtoB
# clean up
git branch -d fromAtoB
Son olarak, bir feragatname: Kayıtları, bazıları artık temiz bir şekilde uygulanmayacak şekilde yeniden düzenlemek oldukça mümkündür. Bunun nedeni, kötü bir sipariş seçmiş olmanız olabilir (yamayı uyguladığı özelliği tanıtmadan önce bir yama koymak); bu durumda rebase ( git rebase --abort
) işlemini iptal etmek isteyeceksiniz . Aksi takdirde, çakışmaları akıllıca düzeltmeniz (tıpkı birleştirme çakışmalarında yaptığınız gibi), düzeltmeleri eklemeniz ve devam git rebase --continue
etmek için koşmanız gerekir. Bu talimatlar, çakışma meydana geldiğinde yazdırılan hata mesajıyla da sağlanır.