2014-12-24 17 views
9

İşte senaryo: Ben git bir şube rebasing amGit rebase --continue, ancak çakışma çözme sırasında belge değişikliklerine taahhüt mesajını değiştirebilir misiniz?

  • , ben çatışmaları vardı ve sadece onları çözüldü (git add ve her şeyi yaptılar).
  • Normalde, sadece
  • Ben çatışmayı

çözümlerken yaptığım değişiklikleri açıklamak, taahhüt Bunun taahhüt mesajı düzenlemek istediğiniz rebase ile devam etmek git rebase --continue aday olacağını ı don Bunu genellikle yaparız, ancak bu özel çatışmanın, belgelenmesi gerektiğini düşündüğüm ciddi bir kayıt yaptırmak gerekiyordu.

Bunu nasıl yaparım? Ben bir tür git rebase --continue --let-me-edit-the-message-first komut vardır umut ediyorum ama the documentation

bunu bulmak mümkün olmamıştır bunu biliyorum: elle kopyalama, ben taahhüt budala çalıştırabilir

  • mesajı işlemek mevcut ve sonra değiştirerek. Bunu yapmak istemiyorum. git rebase, bir yere kaydedilen taahhüt mesajına sahip olmalıdır, çünkü taahhüt ettiğinde orijinal mesajı girecektir. Sadece düzenlemelerimi arasına eklemek istiyorum.
  • Git rebase --continue'u çalıştırabilir ve daha sonra geri dönmek ve söz konusu taahhüt mesajlarını düzenlemek için git rebase -i'u kullanabilirim. Bu, tüm (potansiyel olarak uzun) rebase süreci boyunca hangi taahhütlerde değişiklik yaptığımı hatırlamamı gerektirir. Yuck.

Şimdiye bir cevap bulamadığım için biraz şaşırdım ... Bunu yapmanın bir yolu var. Bunun için bir cevap varsa, onu bulmakta zorlandım. Ben bir özel durumda (gibi this) için çok özel görünüyor değişiklikleri çözdükten sonra git add veya git rm ihtiyacı tutarındaki karışıklık gibi şeyler (gibi this), genel git rebase bilgelik (gibi this ve this) ve bir sürü soru bulundu.

Çok şaşırdığım için bu yanıtı bulamadım, İkincil bir sorum var: rebase sırasında yapılan değişiklikleri belgelemek için temelde daha iyi bir yol var mı?

+1

Git'in bunu yapıp yapmadığını bildiğim kadar ('rebase, çakışma, ekle, devam et - editör '). Yeniden düzenleme yaparken hiç bir mesaj mesajı düzenleyicisi gördünüz mü? Hangi Git sürümü hakkında konuşuyorsunuz? –

+0

Ben 'git rebase --continue'' çalıştırdıktan sonra taahhüt editörü hiç görmedim. Git sürüm 1.9.1 ile çalışıyorum, ancak son sürümlerde büyük farklılıklar olsaydı (çok şaşırmasa da) şaşırırdım. – stochastic

+0

Şimdiye kadar Git 1.9.x ile çalıştım, sanırım şimdi sadece spekülasyon yapabilirim: belki de 'GIT_EDITOR' ortamınız veya 'core.editor' yapılandırmanız berbat mı? Git rebase --continue' yayınlandıktan sonra herhangi bir hata görüyor musunuz? Sadece güvenli tarafta olmak: hangi rebase modunu yapıyorsun? Bir dalın üzerine ya da aleyhine, ya da squash/delete/reword/editing düzenlemeleri için interaktif rebase'a yeniden mi uygulanacaksınız? Lütfen yayınınızdaki senaryonuzu düzenleyerek sürümle birlikte tamamlayın (bu, tamamlandıysa da yayınınızı yükseltmenizi sağlar;). –

cevap

3

Bunun bir sorun olduğunu anlayamadım. (Iş başında Git Bash belki bu farklı çalışır, farklı bir versiyonudur.)

iki şekilde de, aşağıdaki bunu yapabilirsiniz soruna çözüm bulana kadar:

git reset --hard HEAD 
git cherry-pick $(head -1 .git/rebase-apply/patch) 

Çöz

çatışan
git commit 
git rebase --skip 

Siz de takma adları yapabilirsiniz:

git config alias.rebase2cherry "! git reset --hard HEAD; git cherry-pick $(head -1 .git/rebase-apply/patch)" 
git config alias.commitskip "! git commit; git rebase --skip" 

Etkileşimli rebase getiriyor Bu işlem için pick'u seçseniz bile çakışmalarınız olduğunda bir düzenleme mesajı ekranına geçin. Ancak, varsayılan olarak dahil olan çakışan dosyalarla birlikte kiraz seçimiyle aynı biçimi kullanmaz.Etkileşimli farklı komut için

kiraz

git cp $(cat .git/rebase-merge/stopped-sha) 

almak taklit için gereklidir (Hatta. açıklanır bölümde dahil değildir) ile --merge seçeneğini kullanıyorsanız,

girmelisiniz

git kiraz-çekme $ (cat $ DIR/rebase-birleştirme/akım) Dolayısıyla

, bu takma ad kullanmak iyi olurdu şeyleri basitleştirmek için:

git config alias.rebase2cherry '! git reset --hard HEAD; DIR=$(git rev-parse --git-dir); if [[ -f $DIR/rebase-apply/patch ]]; then git cherry-pick $(head -1 $DIR/rebase-apply/patch); elif [[ -f $DIR/rebase-merge/current ]] ; then git cherry-pick $(cat $DIR/rebase-merge/current); else git cherry-pick $(cat $DIR/rebase-merge/stopped-sha); fi' 
+1

Kaynak koduna baktım. Rebase'ın daha önceki sürümlerde bile asla bir editör çağırmayacağına inanıyorum. –

+0

Bunun benim için istenen etkiye sahip olduğunu doğrulayabilirim. Etkileşimli olmayan durumda bu 'git reset --hard' talihsiz bir durumdur, çünkü aslında bunu gerçeğin ardından yapmak zorunda olduğumu anlayabildiğimden, bu yüzden attığım şeyler benim değerli düzenlemelerim olacaktır. 'Git diff --cached> changes.patch' işlevini kullanmanın kiraz toplama işleminden sonra yeniden girmeye yönelik değişiklikleri korumamı sağladığını varsayalım. – stochastic

+0

Cherry-pick, çakışmaları çözmenizi istediğinde git read-tree -u --reset ORIG_HEAD' komutunu uygulayabilirsiniz. –

4

Bu soruya tam olarak aynı sorunla ve cevapla hayal kırıklığına uğratıldıktan sonra, bunun için makul derecede şık bir çözüm buldum, ama sonunda notu görüyorum.

git commit -t .git/rebase-apply/msg-clean 
git rebase --skip 

msg-temiz öylesine bir şablon size bir editör orijinal mesajı verir gibi kullanmaya işlemek yapıyor, taahhüt orijinal mesajı içerdiği anlaşılıyor. Taahhütünüzden sonra, atlama, yaptığınız işlemi yeniden uygulamaya çalışmadan rebase'yi hareket ettirir.

NOT: Gurme değilim, birisi bunu doğrula. Birlikte tokat attığım bir test repo ile çalışıyor gibiydim, ama birkaç saatlik çatışma çözme çalışması ile gerçek çalışma repo'mda denemek için yeterince cesur değildim. Lütfen bu bir şeyleri patlatırsa beni sorumlu tutmayın.

+1

Bir çekicilik gibi çalışır. Bunun için teşekkürler, gerçekten yardımcı oldu. –

+0

Git 2.9.3 ile '.git/rebase-apply/msg-clean' bir rebase sırasında mevcut değil,' msg-clean' dosyası da başka bir yerde mevcut değil. –

İlgili konular