Come modificare un commit senza cambiare il messaggio di commit (riutilizzando il precedente)?


657

C'è un modo per modificare un commit senza vi(o il tuo $EDITOR) spuntare con l'opzione per modificare il messaggio di commit, ma semplicemente riutilizzando il messaggio precedente?


6
Declasserei la mia domanda dopo aver appreso nel modo più duro i mali della correzione.
Sridhar Sarnobat,

28
Finché rispetti determinate regole (come non modificare qualcosa che è già stato spinto) non c'è motivo per cui la modifica deve essere una cosa negativa.
paullb,

3
I commit di modifica non devono essere utilizzati per i commit intermittenti di lavoro durante una singola modifica logica. Per questo dovresti eseguire il commit a livello locale in modo corretto e quindi eliminare la cronologia del commit una volta terminata (@ Sridhar-Sarnobat)
DBCerigo,

3
Sono completamente d'accordo @DBCerigo. L'unica situazione che trovo utile per la modifica è quando ho dimenticato di mettere in scena un file in un precedente commit (ad es. Perché è nuovo e quindi non viene messo in scena automaticamente durante l'esecuzione di git commit -a) e voglio impegnarlo retroattivamente.
Sridhar Sarnobat,

1
Un'altra volta la modifica è utile anche se si riconoscono i pericoli legati alla modifica della cronologia se non si è soddisfatti del messaggio di commit più recente e si desidera riformularlo senza dover riformulare.
Sridhar Sarnobat,

Risposte:


1011

Dalla versione 1.7.9 di git puoi anche usare git commit --amend --no-editper ottenere il tuo risultato.

Tieni presente che ciò non includerà i metadati dell'altro commit come il timestamp che potrebbero essere o meno importanti per te.


42
Puoi anche semplificare l'impostazione predefinita del flag --no-edit aggiungendo un alias: "modifica = commit -a --amend --no-edit"
Jherico

1
@Jherico Suggerirei di rimuovere -a. Si prega di fare commit atomici, è molto più facile rivedere o
rifare

120

git commit -C HEAD --amendfarà quello che vuoi. L' -Copzione accetta i metadati da un altro commit.


15
Solo per aggiungere alla risposta di Andy. Se questo è qualcosa che fai di frequente, puoi impostare un alias per farlo usando git config --global alias.amend 'commit --amend -C HEAD'. È quindi possibile utilizzare git amendcome scorciatoia.
mikej,

9
Forza ragazzi, non essere pigro, aggiorna git e usa il comando integrato che Shaggle suggerisce! Più uno per l'opzione -C però.
Dimitris Baltas,

4
Non solo data e ora, ma anche le informazioni sull'autore!
user1338062,

3
@RyanCastner In effetti, il commento a cui ti riferisci è del 2013. Con la versione git che ho attualmente in esecuzione --amend, anche senza altre opzioni, conserva la data dell'autore (ma cambia la data di commit). Come tale, ho rimosso il mio vecchio commento.
Ruben Verborgh,

2
In realtà questa risposta è preziosa in un modo diverso anche se non è la risposta accettata. A differenza dell'altra risposta, non è necessario utilizzare —amend. È possibile creare un nuovo commit ma utilizzare lo stesso messaggio del commit precedente. Potrebbe non sembrare utile, ma il mio messaggio di commit per impostazione predefinita quando sto solo salvando il mio lavoro senza dover pensare a un bel messaggio di commit, continuo a riutilizzare il messaggio—message=“Work in progress (untested)”
Sridhar Sarnobat,

67

Un'altra possibilità (sciocca) è git commit --amend <<< :wqse hai vi (m) come $EDITOR.


39
Anche se questo non è necessario per questo caso d'uso, non ero a conoscenza del fatto che puoi reindirizzare. Questo apre alcune possibilità intriganti. Ottimo consiglio
Sridhar Sarnobat,

6
... <<< ZZpotrebbe essere anche meno digitando;)
Ruslan

6
..e ancor meno - ... <<< :x:)
skwisgaar,

3
Non penso sia sciocco. È un ottimo modo per migliorare il flusso di lavoro per qualsiasi comando che apre vi.
B Seven

12
staffe a triplo angolo. è nuovo.
Oligofren,

16

Per estendere la risposta accettata, puoi anche fare:

git commit --amend --no-edit -a

per aggiungere i file attualmente modificati.


11

Utilizzo della risposta accettata per creare un alias

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

allora puoi farlo

git oops

e aggiungerà tutto e modificherà usando lo stesso messaggio

o

git oops -m "new message"

per modificare la sostituzione del messaggio

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.