2010-11-11 19 views
8

Şu durumum var: Yerel depoma bazı taahhütler yaptım ve daha sonra başka bir şubenin (~ 150 taahhütleri) ustaya büyük bir birleşimi yaptım - içinde çok fazla çakışma vardı.Git birleştirme yapmadan git birleştirme yaptıktan sonra git rebase -i'yi nasıl kullanabilirim?

Şimdi, itme işleminden önce birleşme işleminden önce yaptığım bir taahhüdünü taşımak istiyorum.

Normalde bunun için "rebase -i" kullanırım.

Ne yazık ki, varsayılan davranış, bir kerede-taahhütte bulunduğum bir kopyasını kırmaktır. Bu, ayrı ayrı taahhütlerde ustalaşmak için 150 daha fazla taahhüt ekledi (başlangıçta birleştirmek yerine rebase kullanacakmış gibi anlıyorum) - birkaç nedenden ötürü benim için kötü davranış.

Yeniden birleştirmek için '-p' bayrağını keşfettim, bu da birleştirme işlemini korudu ve bu konuda çok mutlu oldu. Ne yazık ki, bu aslında aynı birleştirme işlemini uyguladı ve çatışmayı çözme konusundaki sıkı çalışmamı unuttu. Yine - kötü davranış!

İstediğim şey için bir çözüm var mı? Birleştirme sonrası işlemlerimi tekrar etmek zorunda kalmadan yeniden düzenlemek veya belirli işleri düzenlemek için birleştirdikten sonra rebase -i'yi kullanmak?

Teşekkürler!

+2

[git rerere] 'ye bir göz attınız (http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html)? –

+2

'git rerere', şu anda size yardımcı olamaz, çünkü birleştirme işlemini yaptığınızda uyuşmazlık çözümünü kaydeder ... [rerere-train.sh] (http://git.kernel.org/? p = git/git.git; a = blob; f = contrib/rerere-train.sh; hb = HEAD) rerere veritabanını halihazırda yaptığınız birleştirme işlemlerinden gelen "primes" olan git'in katkıda bulunduğu dizinde. – Cascabel

cevap

13

Benim yorumumda bahsettiğim rerere-train.sh betiğinin ne işi var - temel olarak birleştirme işlemini yeniden yapar, çözünürlüğünüzü kullanır ve sadece tekrar görmesini sağlar. İsterseniz taahhüt sadece tek elle yapabilirsiniz:

git checkout <parent of merge commit> 
git merge <merged commit>   # if this goes cleanly, we're done 
git rerere      # done automatically if rerere.enabled is true 
git checkout <merge commit> -- . # check out the files from the result of the merge 
git rerere      # done automatically if rerere.enabled is true 
git reset --hard     # wipe away the merge 

# and you'd want to follow with git checkout <branch> to return to where you were 

Ama aynı zamanda sadece true rerere.enabled ayarlayabilirsiniz ve bu adımları eksi git rerere direkt olarak arama yapmak - ve ayarlanabilir ediyorum Gelecek, anlaşmazlıkları çözdüğünüzde otomatik olarak çalıştırılıyor. yaptığım işte bu harika.

Komut dosyasını doğrudan çalıştırmak istiyorsanız, muhtemelen rerere-train.sh ^<commit before the merge> <current branch> gibi argümanlarla çalıştırmak isteyeceksiniz. (^commit notasyonu anlamına gelen "tarihin içine bu not walk", bu nedenle tüm birleştirme senin repo taahhüt için yapıyorum rahatsız etmez.)

onun şey yapmak için rerere olsun Ancak, İstenen çözünürlükle sonuçlandırılmalıdır. Bu, devam edip yeniden isyanı yapabildiğiniz anlamına gelir ve çatışmaya girdiğinizde, Yeniden Kayıtlandırılan REsolution'ı yeniden kullanır. Sadece bir başlık: hala indekste çelişkili olarak işaretlenmiş dosyaları bırakır, böylece onları denetleyebilir ve ne yaptığının doğru olduğundan emin olursunuz. Bunu yaptıktan sonra, çakışmaları kendiniz çözmüş gibi kontrol etmek için git add kullanın ve her zamanki gibi devam edin!

git-rerere manpage, rerere'nin normal kullanımının çok güzel, uzun bir açıklamasını içerir; bu, hiç bir zaman rerere'yi aramayı gerektirmez - her şey otomatik olarak yapılır. Ve vurgulamadığı bir not: her şey çatışma hunklarına dayanıyor, bu yüzden çatışma hala tamamen aynı metin çatışması olduğu sürece tamamen farklı bir yerde bitse bile bir çözümü yeniden kullanabilir.

+0

Vay, bu ciddi git-fu gibi görünüyor! – Benjol

+0

@Benjol: Çatışma çözümü ciddi bir iş! (Ama bu gerçekten korkutucu değil - sadece yapılandırmada tekrar çalışmayı etkinleştirin ve büyünün gerçekleşmesine izin verin.) – Cascabel

+0

Bağlı git-rerere manpage artık bir 404 Bulunamadı. – Jez

1

Bunu yapmak için bir komut dosyası hazırladım here. Bilinen sınırlamalar için open issues'a bakın.

Önce PATH'nize rerere-train.sh yüklemeniz gerekir.Ben Jefromi cevabı @ kullanıcıdan rerere-train.sh kullanılan

install "$(rpm -ql git|grep '/rerere-train.sh$')" ~/bin 
0

: ile Fedora üzerinde bu yapılabilir. Ben rerere-train.sh çalışması için yönetilen - taşınabilir 2.3.4 -

Michal Marek

The git-sh-setup helper has apparently never been meant to be used by scripts outside of git. This became apparent with git 2.10:

downloading an older version sonra:

$ ../rerere-train.sh HEAD 
C:\Program Files\Git\mingw64/libexec/git-core/git-sh-setup: line 6: .: git-sh-i18n: file not found 

bu http://kernel.opensuse.org/cgit/kernel-source/commit/?h=linux-next&id=d52b9f00588bb18d7f7a0e043eea15e6c27ec40c itibaren Bunu görene: Ancak bu hatayı vardı.

İlgili konular