2014-05-25 12 views
7

Posso comunicare a Git di riutilizzare la risoluzione del conflitto da un commit unione esistente? Ho dovuto rerere disabilitato al momento del commit. Il nuovo commit di merge contiene alcuni commit aggiuntivi sul lato "nostro" dell'unione (ma non dovrebbero introdurre nuovi conflitti poiché hanno modificato un diverso set di file).Riutilizzo della risoluzione dei conflitti con Git


Per esempio, prendete il seguente DAG:

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

Ora, quello che voglio fare è quello di portare commit m e m^ nel ramo old-master (e poi fare che il nuovo master). Non voglio semplicemente unire master in old-master, poiché creerà un nuovo commit di unione (anche se senza conflitti). Voglio ricreare commit o con m e a come genitori.

Il nuovo DAG dovrebbe essere simile:

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

Non mi dispiace usando rerere, se posso dire che in seguito per registrare la risoluzione del merge esistente commit (o).

+0

@ jthill: Non penso che l'altra domanda cerchi di ottenere la stessa cosa. Non stanno rielaborando l'unione con i conflitti, stanno solo rifacendo un'unione che è venuta dopo (e non ha avuto conflitti). – knittl

+0

Sì, ma voglio sostituire 'n' con un nuovo commit' n'' che include i nuovi commit ma ha la stessa risoluzione di conflitto ('o' e' p' nei miei DAG ASCII) – knittl

+0

Scusa per il thrashing, I pagato per non avere un buon affare in anticipo leggendo male il mio codice. [E 'più chiaro ora cosa sta succedendo lì?] (Http://stackoverflow.com/a/21952372/1290731) Ma è sufficiente attivare la rerere e rifare la risoluzione precedente per questo è decisamente meglio se rerere è un'opzione. – jthill

risposta

9

Il modo più semplice per attuare ciò che stai chiedendo è probabilmente per trasformare retroattivamente rerere on:

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 

e ora che rerere ha visto quello che hai fatto con quei conflitti,

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

Ho dovuto usare 'git read-tree --reset -u $ o' per produrre lo stato di indice corretto per il commit –