Git: come riutilizzare / conservare i messaggi di commit dopo "git reset"?


103

Come utente di Git mi imbatto regolarmente nella situazione, che ho bisogno di rielaborare uno o più commit in un modo che non si adattano --amendo rebase -icon i commit di correzione. In genere farei qualcosa di simile

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Considero i messaggi di commit composti in modo ragionevole piuttosto seri. In genere contengono testo più grande con riferimenti e giustificazioni per la modifica. Fino ad ora, sono abbastanza infastidito sul processo lungo per recuperare il mio vecchio messaggio di commit tramite un indifferenziati git reflog, git loge copiare e incollare processo.

C'è un modo migliore per affrontare questo problema? E come sarebbe, se il mio comprende più di un commit?

Modifica: dopo aver riflettuto un po 'su questo, penso che quello che sto cercando sia una funzionalità simile a git stash per i messaggi di commit in cui i commit di correzione / modifica non sono appropriati.


2
Se tutto ciò che hai fatto è stato git reset head~1, il tuo vecchio messaggio di commit non sarebbe solo la seconda voce in reflog?

Sì, ma come potrei riutilizzare il messaggio senza copia e incolla (che in genere richiede l'
annullamento del

Al giorno d'oggi, basta gitkaprire. In questo modo non dovrai nemmeno usare il reflog. In alternativa, usa rev-parse <branch>per ottenere il tuo hash prima del ripristino e usa la risposta di ibizaman.
cst1992

Risposte:


142

Dopo un git reset, questo one-liner può farlo:

git commit --reuse-message=HEAD@{1}

o anche più breve:

git commit -C HEAD@{1}

Puoi usare le altre opzioni fornite da @ user2718704 .


6
Più breve:git commit -C@@{1}
Phu Ngo

2
Questo è un utilizzo fantastico del reflog
David Mann

22
Dopo un ripristino, ORIG_HEAD viene impostato. Trovo git commit --reuse-message=ORIG_HEADche sia il più chiaro.
Scott Jacobsen

45

Quando esegui il comando "git commit", devi controllare le seguenti opzioni,

Riutilizzare,

--reuse-message=<commit>

Per modificare al riutilizzo,

--reedit-message=<commit>

Per cambiare l'autore,

--reset-author

1
Contrassegnato come la nuova soluzione, in quanto fornisce la risposta più completa. Anche se questa soluzione non risolve ancora completamente i miei problemi di "recupero".
bentolor

9

Perché resettare se puoi hackerare, aggiustare, hackerare e poi semplicemente eseguire git commit --amend --no-edit; quindi, mantenendo il messaggio di commit originale.

Per farlo funzionare per più commit, è sufficiente creare un commit temporaneo con le modifiche più recenti e quindi utilizzare un rebase interattivo per schiacciare il commit precedente (contenente il messaggio di commit corretto) con quello nuovo temporaneo, mantenendo il messaggio di commit del vecchio commit.


2
Quando si esegue un rebase interattivo, è anche possibile utilizzare l' fixupistruzione per dichiarare che il commit successivo è quello di correggere il commit precedente e utilizzerà automaticamente il messaggio di commit dall'originale scartando il messaggio dal commit di correzione.
qqx

Ad esempio, se voglio unire nuovamente un pull-request aggiornato. O se il commit non è l'ultimo e non può essere facilmente risolto in base a HEAD ed è più facile rifarli.
bentolor

@BenTebulin Bene, rebase interattivo ti consente di modificare qualsiasi commit in un intervallo di commit specificato. Non è strettamente il commit HEAD che deve essere modificato.
Mart1n

@ mart1n Grazie per aver selezionato edit in rebase -i. Non l'ho mai usato in quel contesto. Per i restanti casi, come la fusione, l'altra risposta è più appropriata alla mia domanda, quindi l'ho contrassegnata come risposta.
bentolor

Intellij ha ambiti che funzionano solo su file che non sono stati ancora sottoposti a commit. È utile reimpostare i file in modo che non sia stato eseguito il commit in modo che intellij possa essere istruito a lintare i file, ad esempio, e quindi eseguire nuovamente il commit di quei file con lo stesso messaggio. la modifica non funzionerà per quello a causa delle limitazioni dell'ambito di intellij.
David Mann

5

Potresti considerare git commit --reset-author -c <commit>di riutilizzare il messaggio di commit con la modifica e l'ora corrente.


Grazie - questo si avvicina molto a quello che stavo cercando.
bentolor
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.