Come faccio a riformulare il primo messaggio di commit di git?


116

Ho un albero funzionante contenente 3 commit:

➜ ~ myproject git: (master) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

Ora desidero rewordil messaggio di commit del mio primo commit (6707a66)

➜ ~ myproject git: (master) git rebase -i 6707

(... entrando in vim)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# 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
#
# 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

In questo caso, desidero correggere ( rewordin git git) il messaggio di commit in questione:

Impegno iniziale (con un messaggio fuorviante)

... a qualcosa di appropriato.

Non sorprende che il mio tentativo sopra non abbia avuto successo poiché il primo commit ovviamente non ha alcun commit genitore . (E quando tu rebase, devi fare riferimento al successivo commit più vecchio prima di quello che desideri reword, giusto?)

Il succo della mia domanda, quindi, puoi raggiungere questo obiettivo con altri mezzi per farlo?


Oppure potresti lasciarlo per sempre come una stranezza pacchiana del
Christopher il


^ Verissimo ... pensavo di aver cercato correttamente questa particolare domanda, ma è la stessa della mia. C'è un'enorme quantità di perfezionamento del copywriting della mia domanda. :-P
Henrik

1
@hced: :) il tuo copywriting non va sprecato - aiuterà altre persone a trovare una soluzione in futuro, anche se dovesse essere chiuso come duplicato
Mark Longair

2
Chiunque si imbatte in questa domanda potrebbe trovare la mia risposta a Modificare il messaggio del primo commit? (git) per essere utile.

Risposte:


215

Fare git rebase -i --root

(punta a rootinvece di puntare a un commit specifico)

In questo modo, viene incluso anche il primo commit e puoi rewordfarlo come qualsiasi altro commit.

L' --rootopzione è stata introdotta in Git v1.7.12(2012). Prima di allora l'unica opzione era usare filter-brancho --amend, che in genere è più difficile da fare.

Nota: vedi anche questa domanda e risposta simili .


12

Puoi sempre usare git filter-branch --msg-filter:

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master

1
fork0: Fantastico, grazie. Curioso, è questa da considerare pratica "legittima", per mancanza di parole migliori. Voglio dire, è comune / consigliato farlo in questo modo? Inoltre, puoi farlo più e più volte nei casi con messaggi di commit errati? Il motivo per chiederlo è perché l'ho fatto per la prima volta con il commit sbagliato SHA-1, copiando il tuo snippet (il tuo era l'ultimo commit mentre volevo cambiare il primo vero e proprio). Dopo aver usato di nuovo il comando, questa volta con SHA-1 corretto (primo commit; 6707a66), mi ha vomitato.
Henrik

Bene, è comune :) E sì, puoi ripeterlo. Se lo aggiungi solo -fandrà avanti e riscriverà sempre i commit del ramo dato. Il valore di riferimento del ramo dalla prima volta è stato salvato in refs/original/master, prima di eseguire il comando.
bivio0

Ovviamente, puoi semplicemente rimuovere (o rinominare) il riferimento salvato.
bivio0

2
Ho aggiornato il codice per assicurarmi che l'errore con l'ID commit copiato non si verifichi. Ora il codice è anche copiabile. Un avvertimento , però: non funziona correttamente se ci sono più di un commit iniziale (cioè quando hai unito due o più rami non correlati)
fork0

3
@hced: Dovresti essere consapevole del fatto che riscrivere qualsiasi commit considerato come "cronologia pubblicata" è solitamente una cattiva idea. Nel tuo caso, ciò significherebbe che generalmente non dovresti farlo se qualcun altro avrebbe mai lavorato su un commit che aveva il tuo root commit come antenato.
Mark Longair

12

L'essenza di pcreux ha un buon modo per riformulare il primo commit:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master

3
A partire da git 1.7.12 , git rebase -i --rootè la strada da percorrere, come suggerito da florisla.
Douglas
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.