Git

2014-05-25 25 views
7

ile çakışma çözünürlüğünü yeniden kullanma Git'e, çakışmayı geçerli bir birleştirme işleminden yeniden kullanmasını söyleyebilir miyim? Teslim sırasında tekrar devre dışı kaldım. Yeni birleştirme işlemi, birleştirme işleminin "bizim" tarafındaki birkaç ek taahhüt içeriyor (ancak farklı bir dosya kümesini değiştirdiklerinde yeni çakışmalar getirmemeleri gerekiyor).Git


Örneğin aşağıdaki DAG atın:

m [master] Add new stuff 
* 
| o [old-master] Merge branch A (conflicts) 
|/a [branch A] 
n * 
* * 
*/ 
* 

Peki ne yapmak istiyorum dalı old-master içine kaydedilmesini m ve m^ getirmektir (ve daha sonra yeni ana emin olun). master'u old-master içine birleştirmek istemiyorum, çünkü yeni bir birleştirme işlemi oluşturacaktır (çakışma olmadan da olsa). o'u m ve a ebeveynleri olarak yeniden oluşturmayı istiyorum.

yeni DAG gibi görünmelidir:

p [old-master] Merge branch A (same conflict resolution as old commit o) 
/| 
m | [master] Add new stuff 
* | 
| a [branch A] 
n * 
* * 
*/ 
* 

I (o) işlemek mevcut birleştirme kararı kaydetmek için sonradan söyleyebilir, rerere kullanmaktan çekinmezler.

+0

git config rerere.enabled true # with rerere turned on, git checkout $o^1 # rerun the original merge git merge $o^2 git read-tree --reset -u $o: # resolve conflicts exactly as before git commit # throwaway commit to feed the results to rerere 

ve o çatışmaları ile ne yaptığını şimdi bu rerere gördü @ jillill: Bence diğer soru aynı şeyi başarmayı denemiyor. Birleşmeyi çatışmalarıyla yeniden yapmıyorlar, daha sonra gelen bir birleşmeyi yeniden yapıyorlar (ve çatışmaları yoktu). – knittl

+0

Evet, ama n 'yeni bir taahhütle' n 'yerine yeni bir taahhütle değiştirmek istiyorum ama aynı uyuşmazlık çözümüne sahip (' o 've 'P' benim ASCII DAG'larım) – knittl

+0

Çökme için özür dilerim Kendi kodumu yanlış okuduktan sonra ön tarafa iyi bakmadığı için ödedim. [Orada neler olup bittiği şimdi açık mı?] (Http://stackoverflow.com/a/21952372/1290731) Ancak, rerere bir seçenek olduğunda rerere'yi açmak ve önceki çözünürlüğü yeniden yapmak oldukça net bir şekilde daha iyi. – jthill

cevap

9

için soruyorsun uygulamak için en basit yolu geriye dönük üzerinde rerere açmak için muhtemelen:

git checkout -B old-master $o^1 # rewind `old-master` to before the merge 
git merge master    # rerun it with current ancestry 
+1

“git read-tree --reset -u $ o” kullanmak zorunda kaldım. –