2013-05-14 14 views
23

Ho eseguito il commit di alcuni codici di test prima di unirli in un ramo remoto. Questa fusione ha avuto molti conflitti e ha richiesto un po 'di tempo per rimediare. Così la mia storia simile a questa:Modifica del messaggio di commit Git fatto prima di un'unione

7ab562c Merge from remote branch 
... whole load of commits brought across from the remote branch... 
f3e71c2 Temporary TESTING COMMIT 

Il codice di prova va bene, ho davvero voglia di cambiare il messaggio di commit. Normalmente andrei avanti con uno git rebase -i f3e71c2^ (dato che nessuno di questi è stato ancora spinto), ma mi è stato detto da un collega che questo rovinerebbe l'unione. Davvero non voglio rovinare l'unione :)

Il mio collega è corretto? E se è così, c'è qualcosa che posso fare o devo solo vivere con questa storia?

+2

'git commit --amend'? – kan

+2

@kan: che funziona solo per modificare l'ultimo commit, che non è la situazione qui. – kampu

+4

Meno paura consigliata! Se si incasina, basta 'git reset --hard 7ab562c' per tornare allo stato post-fusione e riprovare. Inoltre, controlla 'git rerere' per ricordare a git come risolvere un conflitto di merge. – chrisk

risposta

31

Si può provare un git rebase --preserve-merges --interactive, con:

-p 
--preserve-merges 

Invece di ignorare fonde, cercare di ricreare loro.

La sezione BUG della pagina man include:

La lista presentata da todo --preserve-merges --interactive non rappresenta la topologia del grafo delle revisioni.
La modifica dei commit e la riformulazione dei messaggi di commit dovrebbero funzionare correttamente, ma i tentativi di riordinare i commit tendono a produrre risultati controintuitivi.


Come descrive jthill s' comment (dal -p sarà meglio preservare le unioni, se le risoluzioni di conflitti erano registratore):

Puoi retroattivamente rerere luce per una stampa:

git config rerere.enabled true 
git checkout $merge^1 
git merge $merge^2 
git read-tree --reset -u $merge 
git commit -m- 
git checkout @{-1} 
+0

Grazie a @VonC, ma purtroppo, questo non ha funzionato per me. Ho 'reword'ed il commit di test,' pick'ed l'unione, e rebase ancora soffocato sull'unione, buttando fuori 11 file in conflitto. Ho usato il suggerimento di @ chrisk "git reset" per tornare a dove ero, e penso che lo lascerò lì: il tempo investito non vale la soluzione in questo caso. – ChrisWard

+0

@ChrisWard Questo significa che è necessario attivare 'rerere' (http://git-scm.com/docs/git-rerere) per registrare la risoluzione di fusione, che * * * consentirà un rebase' --preserve -merge' senza conflitto. – VonC

+0

Ho ora attivato 'rerere', e ho provato di nuovo il' rebase'. Quando 'rebase' arriva al commit di unione, posso vedere' rerere' registrare le pre-immagini, e poi i conflitti di fusione piovono. Sto supponendo che stia facendo questo perché non ho rerere' attivato quando ho fatto le risoluzioni di conflitto originali, quindi non è a conoscenza di come ho risolto i problemi. Dovrebbe 'rerere' essere in grado di raccogliere quei dati da un commit già risolto? – ChrisWard

-3

Se e solo se i vostri colleghi non hanno spinto/tirato i cambiamenti ontop di f3e71c2 altrove, questo funzionerà. Altrimenti non so cosa succederà. Cambiare il messaggio di commit è completamente estetico (== metadata change), dato che non hai ancora push il commit che vuoi modificare, ma questo potrebbe comunque causare confusione nella storia se i tuoi colleghi hanno spinto/tirato qualsiasi parte della storia che è in cima.

(grazie a Abizern per sottolineare questo fallimento-mode)

+2

Il messaggio è parte dell'oggetto commit, che è immutabile.Se cambi il messaggio, hai cambiato il commit, che cambia la cronologia. – Abizern

+0

@Abizern: È vero. Tuttavia ciò è rilevante solo se i commit sono già stati trasferiti altrove (non lo sono). Ho verificato localmente che questa strategia funzioni in questa situazione. – kampu

+0

@Abizern: Tuttavia, suppongo di non aver considerato che altri potrebbero aver già spinto i commit in altre parti nel frattempo. Questo probabilmente causerebbe confusione/confusione nella cronologia, quindi ho modificato di conseguenza. – kampu

Problemi correlati