Git: modifica solo i messaggi di commit precedenti


12

Per motivi pigri ho spinto un sacco di commit con messaggi predefiniti e ora è diventato ingombrante, poiché non so davvero cosa ho cambiato in ogni commit.

Come posso modificare solo i messaggi dei commit precedenti e (se possibile) mantenere l'albero dei commit?


10
Attenzione a cambiare la storia pubblica!
D. Ben Knoble,

2
temo che le risposte qui non ti diano avvertimenti abbastanza terribili. questo sarà creare una grande confusione se qualcun altro ha tirato la vostra storia nel frattempo - tutte le dà fastidio solo se sono commessi nuovo lavoro su di esso!
Eevee,

Lo userò con la causa, ho un caso più semplice qui, sono l'unico che usa questo repository.
Tuyen Pham,

3
Informazioni: questo è già stato chiesto (probabilmente molte volte) su Stack Overflow .
user202729

Risposte:


20

Per modificare i messaggi di commit di una serie di commit, corro

git rebase -i firstsha

dove si firstshatrova un identificatore per il commit principale del primo commit che voglio modificare. (Puoi utilizzare qualsiasi riferimento valido qui, quindi git rebase -i HEAD~4mostrerà gli ultimi quattro commit.)

Nell'editor che si apre, cambia tutte le voci "pick" in "reword" su commit che desideri modificare, quindi chiudi l'editor; ti verrà chiesto di inserire i messaggi di commit per tutti i commit che hai scelto.

Si noti che questo sarà cambiare l'albero di impegnarsi, perché gli hash dei commit cambieranno. Dovrai forzare il nuovo albero o spingerlo verso un nuovo ramo. Inoltre confonderà le fusioni, quindi evita di modificare i commit di merge.

Per modificare rapidamente solo l'ultimo commit, esegui

git commit --amend

(ma attenzione a qualsiasi cosa messa in scena per commit però).


In che modo influenzerebbe l'albero di commit, creerebbe una linea verticale intermedia nell'albero di commit? Avevo solo un albero di commit della linea verticale ora e oltre 100 messaggi devono essere cambiati.
Tuyen Pham,

3
Non creerà una nuova "linea" nella struttura di commit, cambierà tutti i commit. Se la cronologia è attualmente lineare, rimarrà lineare.
Stephen Kitt,

Dipende. Lo stai usando da solo e non stai spingendo su un server? Quindi no, solo una "linea". Ma per il resto potrebbero essercene due, e in base alle risposte ai primi due possiamo aiutarti a sbarazzarti della vecchia "linea".
Captain Man,

1
Rebase ha una bandiera per gestire le fusioni (penso che sia preserve-merges)
D. Ben Knoble

6

Quello che stai cercando è git rebase.

Se desideri solo modificare il git commitmessaggio precedente , devi solo utilizzare quanto segue:

git commit --amend

Apporta le modifiche desiderate al commit precedente e poi salva le modifiche.

Tuttavia, se è necessario modificare i commit precedenti, è necessario utilizzarli rebase.

git rebase -i HEAD~N 

dove N è uguale al numero di commit a cui desideri tornare, ad es. 2 o 12 o 6, ecc. ecc.

Qui dovresti ottenere un editor di testo con i tuoi commit. Cambia l'opzione da picka rewordper cambiare il messaggio.

Dopo aver identificato tutti i commit che si desidera modificare e aver opportunamente modificato le loro opzioni, salvare e chiudere l'editor. Quindi apportare le modifiche a ciascun messaggio di commit. Una volta che sei soddisfatto puoi eseguire:

git push --force

E avresti dovuto mantenere la tua cronologia git anche se con diversi valori di hash perché hai apportato le modifiche necessarie che desideri. Ecco alcuni link aggiuntivi che dovresti controllare:

7.6 Git Tools - Riscrittura della cronologia
Guida di GitHub - Modifica di un messaggio di
commit StackOverflow - Domanda sulla modifica di vecchi messaggi di commit


Se si "rielabora", non è necessario " commit --amend", a meno che non si confonda in qualche modo il processo di commit.
Stephen Kitt,

Grazie, ecco i passaggi che farò come ho capito dal tuo post: 1. fai git rebase -i firstshaquesto firstshaè l'hash del commit del genitore del commit che vorrei cambiare il messaggio, quindi nell'editor, passare picka reword, enternuovo messaggio, quindi rilasciare git rebase --continuee fare git push --force?
Tuyen Pham,

@StephenKitt, ho appena notato la tua risposta, stavo facendo la mia quando hai inviato la tua. Seguirò i tuoi consigli e cercherò di effettuare tali modifiche. Se è più appropriato, posso unire la mia risposta alla tua aggiungendo i tuoi collegamenti se ritieni che sarebbe più adatto a questa domanda che avere più risposte simili.
kemotep,

@TuyenPham devi solo fare git rebase -i HEAD~Ncon N il numero di commit che vuoi tornare. Modifica ogni opzione di commit di cui vuoi modificare il messaggio da picka reword, salva questo file, apporta le modifiche a ciascuno di quei file di commit e salvali. Una volta che sei sicuro di aver finito, hai solo bisogno git push --force [Name of git branch you are were working on]. Puoi sempre tornare indietro e farlo di nuovo o farlo per gradi.
kemotep,
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.