2014-12-24 12 views
9

Ecco lo scenario:git rebase --continue, ma modifica il messaggio di commit per documentare le modifiche durante la risoluzione dei conflitti?

  • sto rebasing una filiale a git, ho avuto conflitti e solo li risolto (fatto git add e tutto).
  • Normalmente, vorrei solo correre git rebase --continue di procedere con la rebase
  • Voglio modificare il messaggio di commit di questo impegno, per spiegare i cambiamenti che ho fatto durante la risoluzione del conflitto

I don' Di solito lo faccio, ma questo particolare conflitto richiedeva una seria ricodifica, che ritengo debba essere documentata.

Come posso fare? Spero ci sia un comando git rebase --continue --let-me-edit-the-message-first di qualche tipo, ma non sono stato in grado di trovare in the documentation

So che:

  • ho potuto eseguire git commit, copiando manualmente l'attuale messaggio di commit e quindi modificarlo. Non voglio farlo. git rebase deve avere il messaggio di commit memorizzato da qualche parte, perché quando si impegna inserisce il messaggio originale. Voglio solo inserire le mie modifiche in mezzo.
  • Potrei semplicemente eseguire git rebase --continue e quindi utilizzare git rebase -i per tornare indietro e modificare i messaggi di commit in questione in seguito. Ciò mi richiede di ricordare ciò che ho cambiato in cui si impegna durante l'intero processo di rebase (potenzialmente lungo). Che schifo.

Sono un po 'sorpreso di non riuscire a trovare una risposta a questo già ... Sto cercando un modo per farlo. Se c'è una risposta per questo ho avuto difficoltà a trovarlo. Ho trovato le cose come confusione che equivale alla necessità di git add o git rm dopo aver risolto i cambiamenti (come this), generale git rebase saggezza (come this e this), e un sacco di domande che sembrano molto specifico a un caso particolare (come this).

Dal momento che sono così sorpreso che non ho trovato questa risposta, Ho una domanda secondaria: c'è un modo fondamentalmente migliore per documentare le modifiche apportate durante rebase?

+1

Fino a quando mi hai chiesto ero sicuro che Git lo faccia ('rebase, conflict, add, continue -> editor'). Hai mai visto un editor di messaggi di commit durante la ridefinizione? Di quale versione Git stai parlando? –

+0

Non credo di aver mai visto l'editor dei messaggi di commit dopo aver eseguito '' git rebase --continue''. Sto lavorando con git versione 1.9.1, ma sarei sorpreso (anche se non troppo sorpreso) se ci fossero enormi differenze tra le versioni recenti. – stochastic

+0

Non ho ancora lavorato con Git 1.9.x, immagino, quindi ora posso solo ipotizzare: forse il tuo ambiente 'GIT_EDITOR' o' core.editor' è incasinato? Vedi qualche errore dopo l'emissione di 'git rebase --continue'? Solo per essere al sicuro: quale modalità di rebase stai facendo? Rebase su o contro un ramo, rebase interattivo per lo squash/delete/reword/edit commit? Si prega di completare lo scenario nel tuo post insieme alla versione modificando (questo mi farà invitare anche il tuo post se è completo;). –

risposta

3

Non ho mai capito che questo è un problema. (Il mio Git Bash sul posto di lavoro è una versione diversa, quindi forse funziona in modo diverso.)

In entrambi i casi, fino a trovare una soluzione a questo problema è possibile effettuare le seguenti operazioni:

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

risolvere i conflitti

git commit 
git rebase --skip 

È possibile effettuare alias così:

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" 

rebase interattivo fa portare su una schermata di modifica dei messaggi quando si verificano conflitti anche se si sceglie pick per quel commit. Tuttavia, non utilizza lo stesso formato del cherry pick con i file in conflitto inclusi per impostazione predefinita.(Non è nemmeno inclusa nella sezione commentata.)

Per interattivo un comando diverso è necessario per emulare ciliegio raccogliere

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

e se si utilizza l'opzione --merge è necessario immettere

git cherry-pick $ (cat $ DIR/rebase-merge/corrente)

Pertanto, per semplificare le cose sarebbe meglio utilizzare questo alias:

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

Ho controllato il codice sorgente. Credo che rebase non chiami mai un editor, anche nelle versioni precedenti. –

+0

Posso confermare che questo ha avuto l'effetto desiderato per me. Quel 'git reset --hard' nel caso non interattivo è sfortunato, poiché normalmente mi rendo conto che ho bisogno di farlo dopo il fatto, e quindi le cose che scarterei sarebbero le mie preziose modifiche. Suppongo che l'uso di 'git diff --cached> changes.patch' mi consenta di conservare tali modifiche per la reintroduzione dopo il cherry pick. – stochastic

+0

Si può fare git read-tree -u --reset ORIG_HEAD' quando il cherry-pick ti chiede di risolvere i conflitti. –

4

Dopo essere venuto a questa domanda con lo stesso identico problema ed essere deluso dalla risposta, penso di aver trovato una soluzione abbastanza elegante per questo, ma vedere la mia nota alla fine.

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

msg-pulito sembra contenere il messaggio originale commit, così facendo un commit utilizzando come modello ti dà il messaggio originale in un editor. Dopo il commit, il comando salta il rebase senza tentare di riapplicare il commit appena effettuato.

NOTA: non sono un guru, quindi per favore verifica qualcuno. Sembrava funzionare con un repo di prova che ho schiaffeggiato insieme, ma non ero abbastanza coraggioso da provarlo sul mio vero repo di lavoro con molte ore di risoluzione dei conflitti. Per favore non ritenermi responsabile se questo fa saltare in aria qualcosa.

+1

Funziona come un fascino. Grazie per quello, è stato davvero utile. –

+0

Con Git 2.9.3, '.git/rebase-apply/msg-clean' non esiste durante un rebase, né un file' msg-clean' esiste da nessun'altra parte. –

Problemi correlati