C'è un modo per modificare un messaggio di commit su GitHub?


130

C'è un modo per modificare un messaggio di commit dopo aver eseguito il commit e l'invio a GitHub? Vedo che esiste un 'aggiungi una nota' oltre a commenti in linea, ma nessuna modifica effettiva di un messaggio di commit. Esiste anche "modifica commit" nelle estensioni git ma ciò non modifica il messaggio esistente.


Puoi provare a ripristinare il commit (vedi alcune opzioni in questa domanda SO: stackoverflow.com/questions/4114095/… ) - assicurati solo di eseguire prima il backup di eventuali modifiche al codice in modo da non perderle per il gusto di commentare!
Traveling Tech Guy

Risposte:


184
  1. git rebase -i <commit hash you want to change>^

    Questo aprirà il tuo editor predefinito (di solito ) con un elenco di commit e azioni per ognuno. Per impostazione predefinita, l'azione è pick.

  2. Per ogni commit che desideri modificare il messaggio, pickpassa a reword.

  3. Salva ed esci (in vi:) :wq.

  4. Per ciascuno di questi commit, otterrai un editor per modificare il messaggio di commit. Modificalo come ritieni opportuno, salva ed esci.

    Una volta terminata la modifica di tutti i messaggi di commit, tornerai al prompt dei comandi e avrai un nuovo albero con i messaggi aggiornati.

  5. Ora puoi caricarli su github usando git push origin --force.

Se devi solo correggere l'ultimo commit, puoi sostituire i passaggi 1-4 con git commit --amend.


3
@MatthewPeters Suppongo che dovrebbe esserci un modo, ma non lo so - Uso direttamente la riga di comando.
Mureinik,

4
Sembra che non sia possibile specificare <hash di commit che si desidera modificare>, piuttosto è necessario specificare l'hash del commit precedente a quello che si desidera modificare o utilizzare HEAD ~ x dove x è il numero di commit da HEAD dove l'articolo che desideri modificare risiede.
ssc327,

3
@ ssc327 Da notare che io ^ci sono stato - in effetti ho suggerito di rinnovare il genitore del commit che desideri modificare.
Mureinik,

2
@Murenik hai ragione, in qualche modo mi è mancato vedere il ^
ssc327 il

1
@deadfish Utilizzando la riga di comando di Windows, è necessario digitare ^^per terminare il comando con un valore letterale, ^ ad esempio: git rebase -i 2c747b32^^
Wyck,

35

In Intellij Idea puoi farlo così facilmente.

  1. Controllo versione aperta (cronologia)
  2. Seleziona la scheda registro
  3. Seleziona commit per cambiare commento
  4. premi F2 (Mac fn + F2) e aggiorna il tuo messaggio di commit

1
Non funziona se si è già passati al telecomando.
pagamento

8
Devi eseguire in git push origin --forceseguito come suggerito nella risposta di @ Mureinik.
Dan Macák,

1
L'opzione "reword" è disabilitata se il commit è già stato inviato.
huyz,

1
Per farlo con Intellij IDEA per un commit che è stato spinto, devi prima iniziare con un rebase interattivo (come faresti dalla riga di comando di Git). Per eseguire il rebase, fai clic con il pulsante destro del mouse sul tuo progetto -> voce di menu "Git" -> "Repository" -> "rebase ..." (ultima voce di menu). Inserisci lo SHA del commit prima di quello che vuoi modificare nel campo "Onto" e fai clic su "Rebase". Verrà quindi visualizzato il prompt di rebase interattivo. Seleziona "reword" nella casella di riepilogo delle azioni accanto ai commit che desideri modificare e fai clic sul pulsante "Avvia rebasing" (continua nel prossimo commento)
jplandrain

1
(continua) Verrà quindi presentato un prompt di testo per ogni commit che si desidera modificare. Dopo aver modificato i messaggi di registro, è possibile applicare ulteriori modifiche (si noti che ora l'opzione "reword" non è più disattivata). Al termine, è possibile forzare il push delle modifiche per concludere il rebase interattivo. L'intero processo è in realtà esattamente lo stesso della risposta di @Mureinik che invece lo sta eseguendo dalla riga di comando.
jplandrain,

3

Premessa:

se il tuo grafico git sembra ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192e b7ec061sono gli hash di commit di commit-commit e parent-commit, separatamente)

Soluzione:

puoi semplicemente digitare le seguenti istruzioni ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Spiegazione:

  1. git reset --soft b7ec061 manterrà le modifiche ai file e ripristinerà il commit dei genitori (es. b7ec061)
  2. git commit -m "..." creerà localmente un nuovo commit
  3. git push -f invierà il nuovo commit al server e sostituirà quello vecchio (es. df9c192)

2

Un'altra opzione è quella di creare un ulteriore "commit errata" (e push) che faccia riferimento all'oggetto commit che contiene l'errore - il nuovo commit errata fornisce anche la correzione. Un commit errata è un commit senza modifiche sostanziali al codice ma un messaggio di commit importante - ad esempio, aggiungi un carattere spazio al tuo file readme e commetti quella modifica con il messaggio di commit importante, oppure usa l'opzione git --allow-empty. È sicuramente più facile e sicuro della rebasing, non modifica la vera storia e mantiene pulito l'albero del ramo (usandoamendè anche una buona scelta se stai correggendo il commit più recente, ma un commit errata potrebbe essere una buona scelta per i commit più vecchi). Questo tipo di cose accade così raramente che semplicemente documentare l'errore è abbastanza buono. In futuro, se è necessario cercare un log git per una parola chiave della funzione, il commit originale (errato) potrebbe non apparire perché è stata utilizzata la parola chiave errata in quel commit originale (il refuso originale) - tuttavia, la parola chiave apparirà nel commit errata che ti indicherà il commit originale che aveva il refuso. Ecco un esempio:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Autore: primo ultimo 
Data: mer 8 agosto 15:55:52 2018 -0600

    Commissione Errata:
    Questo commit non ha modifiche sostanziali al codice.
    Questo commit viene fornito solo per documentare una correzione a un precedente messaggio di commit.
    Questo riguarda l'oggetto di commit e083a7abd8deb5776cb304fa13731a4182a24be1
    Messaggio di commit errato originale:
        Il colore di sfondo è cambiato in rosso
    Correzione (* modifica evidenziata *):
        Colore dello sfondo modificato in * blu *

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autore: primo ultimo 
Data: mer 8 agosto 15:43:16 2018 -0600

    Qualche messaggio di commit temporaneo

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Autore: primo ultimo 
Data: mer 8 agosto 13:31:32 2018 -0600

    Il colore di sfondo è cambiato in rosso

Di sicuro è sicuro, ma molto testo da leggere. Preferirei riscrivere la storia :)
pkalinow

0

La risposta di @Mureinik è buona ma non comprensibile per i principianti.

Primo metodo:

  1. Se vuoi solo modificare l'ultimo messaggio di commit, allora hai solo bisogno git commit --amend, vedresti:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Come puoi vedere, esegui il commit del messaggio in alto senza alcun prefisso di comando come pick, questa è già la pagina di modifica e puoi direttamente modificare il messaggio in alto e salvare ed uscire , ad esempio:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Quindi fare git push -u origin master --forceo <how you push normally> --force. La chiave qui è --force.

Secondo metodo:

  1. Puoi vedere l'hash di commit git logo estrarre dall'URL del repository, ad esempio nel mio caso881129d771219cfa29e6f6c2205851a2994a8835

  2. Quindi puoi fare git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835o git rebase -i HEAD^(se l'ultimo)

  3. Vedresti:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Ma se vedi noopche probabilmente stai scrivendo male, ad esempio se fai ciò git rebase -i 881129d771219cfa29e6f6c2205851a2994a88che manca ^alla fine, è meglio chiudere l'editor senza salvare e capire il motivo:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Se non ci sono noopproblemi, cambia semplicemente la parola pickin reword, altro rimane (non modifichi il messaggio di commit a questo punto), ad esempio:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Salva ed esci vedrà la pagina di modifica simile al metodo n. 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Modifica il messaggio in alto, come il metodo n. 1 e salva ed esci, ad esempio:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Ancora una volta, come il metodo n. 1, do git push -u origin master --forceor <how you push normally> --force. La chiave qui è --force.

Per maggiori informazioni leggi il documento .

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.