Cambia il vecchio messaggio di commit su Git


136

Stavo cercando di modificare un vecchio messaggio di commit, come spiegato qui .

Il fatto è che ora, quando provo a eseguirlo rebase -i HEAD~5, dice interactive rebase already started.

Quindi provo: git rebase --continuema ho ricevuto questo errore:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Qualche idea?

Risposte:


125

Dice:

Quando salvi ed esci dall'editor, ti riporterà all'ultimo commit in quell'elenco e ti lascerà sulla riga di comando con il seguente messaggio:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Non significa:

digitare di nuovo git rebase -i HEAD~3

Cerca di non digitare git rebase -i HEAD~3quando esci dall'editor e dovrebbe funzionare correttamente.
(altrimenti, nella tua situazione particolare, git rebase -i --abortpotrebbe essere necessario ripristinare tutto e consentire di riprovare)


Come menziona Dave Vogt nei commenti, git rebase --continueè per passare al compito successivo nel processo di rebasing, dopo aver modificato il primo commit .

Inoltre, Gregg Lind menziona nella sua risposta il rewordcomando digit rebase :

Sostituendo il comando "pick" con il comando "modifica", puoi dire git rebasedi interrompere dopo aver applicato quel commit, in modo da poter modificare i file e / o il messaggio di commit, modificare il commit e continuare a ripetere la reimpostazione.

Se vuoi solo modificare il messaggio di commit per un commit, sostituisci il comando " pick" con il comando " reword" , da Git1.6.6 (gennaio 2010) .

Fa la stessa cosa ' edit' durante un rebase interattivo, tranne per il fatto che consente solo di modificare il messaggio di commit senza restituire il controllo alla shell . Questo è estremamente utile.
Attualmente se vuoi ripulire i tuoi messaggi di commit devi:

$ git rebase -i next

Quindi imposta tutti i commit su 'modifica'. Quindi su ognuno:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

L'uso di ' reword' anziché ' edit' consente di saltare le chiamate git-commitegit-rebase .


2
Inoltre, git rebase --continuepassa all'attività successiva nel processo di rebasing, dopo aver modificato il primo commit.
Dave Vogt,

1
Aggiunta del collegamento all'articolo wiki di github per la modifica di un messaggio di commit
Gioia

60

Come suggerito da Gregg Lind, è possibile utilizzare reword per ricevere la richiesta di modificare solo il messaggio di commit (e lasciare intatto il commit altrimenti):

git rebase -i HEAD~n

Ecco nl'elenco degli ultimi n commit.

Ad esempio, se lo usi git rebase -i HEAD~4, potresti vedere qualcosa del genere:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Ora sostituisci pick con reword per i commit di cui vuoi modificare i messaggi:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Esci dall'editor dopo aver salvato il file e successivamente ti verrà chiesto di modificare i messaggi per i commit che hai contrassegnato come reword , in un file per messaggio. Si noti che sarebbe stato molto più semplice da solo modificare il commit messaggi quando si sostituiti pickcon reword, ma facendo che non ha alcun effetto.

Ulteriori informazioni sulla pagina di GitHub per la modifica di un messaggio di commit .


Molto ben spiegato. Grazie: D
Shubham Jain,

Grazie @ShubhamJain Felice che la mia risposta sia stata utile
Punit Vara,

L'ho fatto, e poi si è impegnato da altri rami presenti nel mio ramo
Reza il

@Reza potresti aver incasinato qualcosa. Prova questo in qualche altro repository. Questa soluzione funziona perfettamente
Punit Vara il

54

FWIW, git rebase interattivo ora ha un'opzione "reword", che lo rende molto meno doloroso!


3
Durante l'utilizzo reword, perché git non consente semplicemente di modificare i messaggi di commit in quel file con l'elenco dei commit? Avvia invece l'editor con un file di messaggio di commit per rewordriga. Questo non è necessario. Anche se altre azioni diverse picko che rewordrichiedono l'avvio di comandi esterni, rewordnon lo richiederebbero.
Dan Dascalescu,

9

Volevo solo fornire un'opzione diversa per questo. Nel mio caso, di solito lavoro sui miei rami individuali, quindi mi unisco al master e gli impegni individuali che faccio al mio locale non sono così importanti.

A causa di un hook git che controlla il numero di ticket appropriato su Jira ma fa distinzione tra maiuscole e minuscole, mi è stato impedito di inviare il mio codice. Inoltre, il commit è stato fatto molto tempo fa e non volevo contare quanti commit per tornare sul rebase.

Quindi quello che ho fatto è stato creare un nuovo ramo dall'ultimo master e schiacciare tutti i commit dal ramo problematico in un singolo commit sul nuovo ramo. È stato più facile per me e penso che sia una buona idea averlo qui come riferimento futuro.

Dall'ultimo maestro:

git checkout -b new-branch

Poi

git merge --squash problem-branch
git commit -m "new message" 

Referece: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
La tua risposta mi ha davvero salvato la giornata :). Ho lottato rebase -iper circa 2 ore e senza successo. Il mio commit era dietro 18 commit, quindi puoi immaginare. Questo è stato il modo più semplice e pratico che ho trovato senza dover usare rebase. Grazie amico!
Carlos Parra,

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.