Come correggere, modifica o annulla i commit di Git (cambia la cronologia di git)

Contenuti

Logo Git

La cronologia dei commit di Git è progettata per essere immutabile (per la maggior parte) e tieni traccia di ogni cambiamento nel tuo progetto in modo da non perdere mai lavoro. tuttavia, a volte è necessario riscrivere la cronologia di git, quindi Git fornisce alcuni strumenti per modificare i commit esistenti.

Aggiungi nuove modifiche ai commit

Il caso d'uso più comune per questo è quando crei un messaggio di commit e poi, prima di premere il telecomando, ti rendi conto di aver commesso un errore e devi fare un piccolo cambiamento. Certo, potrebbe fare una seconda conferma, ma non è necessario e mostra anche a tutti i suoi colleghi il suo stupido errore quando finalmente preme il telecomando.

Se stai solo aggiungendo modifiche, Puoi usare git commit --amend. Questo modifica il commit più recente e lo unisce con eventuali modifiche aggiuntive apportate.

Primo, dovrai organizzare le tue modifiche:

git add .

E poi modificare:

git commit --amend --no-edit

il --no-edit flag farà sì che il comando non modifichi il messaggio di conferma. Se hai bisogno di chiarire le nuove modifiche in un nuovo messaggio, lascia questo check out e ti verrà richiesto il nuovo messaggio di conferma.

Underhood, il comando di modifica effettua un nuovo commit con le modifiche aggiuntive e quindi sostituisce completamente il commit di origine nella cronologia di Git. Il commit precedente è ancora accessibile da git reflog (di più su quello sotto), ma in futuro, la nuova conferma è l'unica che esiste. Quando si esegue il push in un repository remoto, non c'è modo di sapere che il commit è stato modificato, è un cambiamento puramente locale.

A causa di ciò, non vuoi modificare le conferme che sono già state inviate, poiché incontrerai molti problemi e dovrai spingere con la forza verso il telecomando, cosa non va bene per nessuno.

Modifica solo il messaggio di commit di Git

Se non hai bisogno di apportare modifiche e vuoi solo correggere un errore di battitura, può eseguire amend anche senza alcun cambiamento:

git commit --amend -m "un messaggio di commit aggiornato"

Modifiche instabili dai commit

Il comando di modifica di Git funziona solo se è strettamente aggiungendo i cambiamenti. Quando diciamo “aggregato”, non intendiamo solo nuove righe di codice; la modifica di una riga di codice aggiunge anche modifiche. Elimina una riga di codice, o un file completo, è anche un cambiamento che si aggiunge, anche se stai rimuovendo i dati dal progetto quando viene applicata tale modifica.

tuttavia, ci sono anche casi in cui potresti voler rimuovere le modifiche dai commit. Ad esempio, diciamo che è scappato:

git add .
git commit

E ha aggiunto tutte le modifiche nel tuo repository alle modifiche in scena, e li ho impegnati, prima che tu lo sappia, "Oh, merda! Non volevo inviare quel file! ” In questo caso, dovresti rimandare tutte le modifiche alla fase di preparazione e, prossimo, eliminare manualmente la fase dei file che non si desidera inviare.

La soluzione è eseguire un riavvio, rimuovere il commit e restituire le modifiche. Esistono alcuni tipi di riavvio, ma tutti implicano l'acquisizione di commit dalla cronologia di Git e il loro rinvio alla fase di test, nella directory locale o direttamente nel cestino.

In questo caso, quello che vuoi è un soft reset, che porterà tutte le modifiche alla fase iniziale. Puoi usare la seguente abbreviazione per resettare il commit dietro HEAD; altrimenti, sarà necessario ottenere il riferimento da git reflog:

git reset --soft HEAD~

Dopo, dovrai eliminare il file che non vuoi compromettere. Il modo per farlo è in realtà anche un riavvio, in questo caso, un riavvio misto su un file specifico:

git reset --nome file misto

Funziona perché il ripristino di questo file rimuoverà le modifiche dalla fase di preparazione e non verrà eseguito il commit quando esegui nuovamente il commit.

Puoi anche eseguire un riavvio misto sull'intero repository, e git add tutti i file tranne quello che non vuoi. Questo è più facile da fare se stai usando un client Git con GUI.

Hai bisogno di annullare? / eliminare un commit? Usa rollback

Il ripristino di un commit è il modo più semplice per rimuovere le modifiche. Fondamentalmente, prendere tutte le modifiche dalla conferma della destinazione e applicare il contrario. Se hai creato un file, se elimina. Se hai rimosso una riga di codice, quel codice viene aggiunto di nuovo. È la forma approvata da Git di “rimuovere” oh “disfare” una conferma, poiché l'originale è ancora conservato nella cronologia di git.

Per usarlo, correre git log per vedere le conferme:

git log

Copia l'ID referrer e poi ripristina il commit:

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Se solo fossi coinvolto in vim, premi Q, e magari corri git config --global core.editor "nano".

Usa Rebasing per qualcosa di più complicato

Overrun è essenzialmente un metodo per spostare i commit nel tuo repository. Invece di fondere, rebase riscrive la cronologia di git per spostare i singoli commit in una nuova posizione. I commit originali vengono lasciati in sospeso e rimossi dalla cronologia ufficiale di Git, anche se sono ancora lì dentro git reflog.

Non entreremo nei dettagli esatti qui., ma se sei interessato a come funziona, puoi leggere la nostra guida all'uso git rebase.

E se volessi tornare indietro??

fortunatamente, Git tiene un registro di ogni modifica, anche quando infrangi le regole e riscrivi la storia.

Ogni volta che il tuo suggerimento di filiale viene aggiornato per qualsiasi motivo, Git memorizza lo stato del contenuto della directory prima dell'aggiornamento nel Record di riferimento, oh reflog. È possibile visualizzare il registro con git reflog:

git reflog

Molte di queste saranno vere conferme, ma include anche altre modifiche. Se hai bisogno di tornare a qualche cambiamento individuale, può eseguire un hard reset:

git reset --hard fdb9db9

Questo fornisce una buona rete di sicurezza, ma dovresti essere avvisato che la nuova registrazione tiene traccia solo delle modifiche effettivamente apportate, non solo sono stati eseguiti, e segui solo i movimenti della punta del ramo. Cosa c'è di più, reflog conserva solo le voci per 90 giorni. Successivamente, potrai solo azzerare le conferme effettive.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.