git: interrompe il commit durante la digitazione del messaggio


131

Sono nel mezzo di un impegno. Ho scritto il mio messaggio di commit in vim. Ora mi ricordavo che dovevo cambiare qualcosa. Mi rendo conto che ci sono altre opzioni per ottenere ciò che voglio, ma voglio sapere se esiste un modo per interrompere il commit ma salvare comunque il messaggio di commit che ho digitato finora.

Risposte:


85

Sì. Scrivi il messaggio di commit in un altro file ( :w /some/other/path.txt). Quindi chiudere l'editor senza salvare ( :q!). Se in precedenza hai salvato il file nel suo percorso originale, elimina tutto e scrivi prima il file vuoto (un messaggio di commit vuoto interromperà il commit).

Ora, quando sei pronto per eseguire il commit "per davvero", usa il file di messaggi che hai salvato nel percorso alternativo.

In alternativa, copia il messaggio di commit in uno dei buffer di vim.

Vale la pena notare che davvero non devi assolutamente farlo : commit --amendti consente di modificare il commit dopo che è stato effettuato, quindi la soluzione semplice è quella di produrre il commit con quello che hai e quindi risolverlo prima di spingere. Puoi anche semplicemente terminare il commit nel suo stato non funzionante reset HEAD~(ripristina lo stato in cui si trovava la tua copia di lavoro prima del commit), correggi la tua copia di lavoro e quindi commit -a -c HEAD@{1}utilizzare il vecchio messaggio di commit.


7
Nota: uscire da vim usando ": q!" non interromperà il commit se è presente un messaggio di conflitto di unione copiato automaticamente. Invece il commit continuerà e il messaggio non elencherà quali file hanno avuto conflitti.
stephenbez,

write the empty file (an empty commit message will abort the commit)la parte ha funzionato come un incantesimo, grazie!
Саша Давиденко

182

Se il tuo editor può uscire con un codice di errore, Git interromperà il commit. Quando si utilizza VIM, digitare

:cq

per uscire con un codice di errore diverso da zero e interrompere il commit.


5
Questo è un bel trucco per interrompere un commit --amendcome altrimenti dovresti eliminare il messaggio di commit esistente e :wq.
Alex Jasmin,

2
Bel trucco! Tuttavia, la domanda era come salvare il messaggio di commit, non eliminarlo.
Elijah Lynn,

quindi come fa svn a farlo? cosa osserva oltre al codice di uscita?
Chaim Geretz,

1
fantastico quando stai facendo un rebase interattivo, noto anche come commit di schiacciamento
hellatan,

mi ha salvato la vita quando l'ho fatto git commit --amendinvece che git rebase --continuedurante un rebase.
Weishi Zeng,

68

Se hai aperto vim per scrivere il tuo messaggio di commit, cancella semplicemente le righe che non iniziano con # e git interromperà il tuo commit

Aborting commit due to empty commit message.

11
Ciò è particolarmente utile quando si desidera interrompere un commit git --amend.
Edsko,

1
La domanda era: come annullare il commit ma salvare il messaggio di commit. L'eliminazione di righe che non iniziano con # elimina efficacemente il messaggio di commit, non salva il messaggio di commit. Non sono sicuro di come questo abbia tanti voti positivi.
Elia Lynn il

2
ggdGtaglierà tutto il contenuto del messaggio, quindi alla prossima esecuzione vimpuoi solo Pil testo che hai precedentemente tagliato.
oromoiluig,

funziona usando nano, ctrl + k tutte le righe quindi salva ed esce si interromperà
Juh_18

9

Mentre è possibile interrompere il commit, un altro approccio è quello di modificare il commit in seguito. È sufficiente eseguire il commit del lavoro corrente, quindi apportare le modifiche aggiuntive desiderate git add, quindi eseguirle git commit --amend. Verrai reinserito nell'editor dei messaggi di commit e, quando salvi, il commit verrà modificato per includere le modifiche aggiuntive e il tuo nuovo messaggio di commit.


7

Si è possibile. Per eseguire il commit, il tuo editor DEVE scrivere il messaggio di commit nel file .git/COMMIT_EDITMSGe uscire con un codice di stato 0.

Quindi se stai usando VI / VIM, potresti voler fare quanto segue ...

  1. Scrivi il tuo messaggio di commit.
  2. Salva il messaggio di commit con :w(di default questo salverà il contenuto corrente in .git/COMMIT_EDITMSG)
  3. Chiudi l'editor con un errore :cq
  4. ... fai quello che devi fare ... persino aggiungi / rimuovi file nell'area di gestione temporanea.
  5. Continua con la modifica del messaggio di commit esistente con git commit -eF .git/COMMIT_MESSAGE

Il -F /path/to/filepopolerà l'editor con qualsiasi dato contenuto da / percorso / a / file. Tuttavia, per impostazione predefinita questo eseguirà immediatamente il commit, a meno che tu non fornisca il -eflag in aggiunta per la modifica .


funziona, ma è meno preferibile perché 1) presuppone che il CWD sia dove si trova la cartella .git 2) uso git worktrees , e con git worktrees, .git è in realtà un file dice dove si trova la vera cartella .git.
Alexander Bird,

@AlexanderBird questo non è vero ... quando vuoi raccogliere il vecchio messaggio di commit nel passaggio 5), dovresti solo specificare un percorso relativo (diciamo che sei nella /foo/bar/directory, relativo dalla radice dei progetti) comegit commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek,

@AlexanderBird cool, non l'ho ancora notato con la caratteristica di più alberi di lavoro in git. Grazie per il suggerimento! Credo che l'unico aspetto negativo di questo sia che dovresti tenere una visione generale nella tua testa, che ti impedisce di concentrarti sul codice reale. E solo per aver raccolto il messaggio di commit su "dove mi ero interrotto` è un po 'pesante :)
Rudolf Tucek,

1
@AlexanderBird invece di :wfarlo :sav committmpegit commit -eF committmp
Hashbrown,

0

Di solito mi impegno a IntelliJutilizzare i terminali forniti. Purtroppo i miei commit sono manuali:

git commit -m'my message' // etc

quindi l'unica cosa che penso sia sicura è chiudere semplicemente la finestra del terminale! Basta evidenziare il testo se si desidera salvarlo, quindi copiare, quindi chiudere la finestra del terminale.


-2

La risposta di @bdonlan va bene proprio per questa domanda, ma ti faccio notare una situazione in cui potresti desiderare una soluzione migliore.

Supponi di voler aggiungere modifiche all'ultimo commit. Quindi fai come suggerito da @bdolan:

git add files
git commit --amend

Immagina che durante la scrittura del nuovo messaggio, ti penti di aver aggiunto quei file a quel commit. Il problema è che sei bloccato con un messaggio di commit già salvato e l'uscita dall'editor (con o senza salvataggio) aggiungerà tali modifiche all'ultimo commit. Per tornare al punto in cui ti trovavi prima di queste azioni devi dividere l'ultimo commit - scommetterei che vuoi evitarlo.

Il trucco è salvare ed uscire dall'editor mentre ha solo righe che iniziano con #o nessuna riga. Quando esci sarai accolto con il messaggio:

Aborting commit due to empty commit message.

E non hai affatto cambiato l'ultimo commit.


Se capisco che cosa stai dicendo è un problema, allora sei errato; come dimostrato qui: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Cioè: se voglio "annullare" l'emendamento, non devo dividere il commit precedente. l'oggetto commit che era HEAD prima della modifica viene salvato come HEAD@{1}. Inoltre, zetta ha già suggerito di eliminare tutte le righe non di commento.
Alexander Bird,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.