Come correggere, modificare o annullare i commit di Git (modifica della cronologia di Git)

0
230

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.

Aggiunta di nuove modifiche ai commit< /h2>

Il caso d'uso più comune per questo è quando fai un messaggio di commit e poi, prima di inviare al tuo telecomando, ti rendi conto che hai sbagliato e devi apportare una piccola modifica. Ovviamente potresti semplicemente fare un secondo commit, ma non è necessario e mostra anche a tutti i tuoi colleghi il tuo stupido errore quando alla fine premi sul telecomando.

Se stai semplicemente aggiungendo modifiche, puoi usare git commit –amend. Questo modifica il commit più recente e unisce le modifiche aggiuntive che hai messo in scena.

Per prima cosa, devi mettere in scena le tue modifiche:

git add .

E poi modifica:

git commit –amend –no-edit

Il flag –no-edit farà in modo che il comando non modifichi il messaggio di commit. Se hai bisogno di chiarire le nuove modifiche in un nuovo messaggio, lascia fuori questo flag e ti verrà richiesto il nuovo messaggio di commit.

Sotto il cofano, il comando di modifica effettua un nuovo commit con le modifiche extra e quindi sostituisce completamente il commit di origine nella cronologia di Git. Il vecchio commit è ancora accessibile da git reflog (più su quello sotto), ma andando avanti, il nuovo commit è l'unico esistente. Quando si esegue il push a un repository remoto, non c'è modo di sapere che il commit è stato modificato, è una modifica puramente locale.

Annuncio

Per questo motivo, non vuoi modificare i commit che sono già stati inviati, poiché incontrerai molti problemi e dovrai forzare il push al remoto, il che non va bene per nessuno.

Modificare solo il messaggio di commit di Git

Se non è necessario apportare modifiche e si desidera solo correggere un errore di battitura, è possibile eseguire anche la modifica senza modifiche:

git commit –amend -m “un messaggio di commit aggiornato”

Rimozione delle modifiche dai commit

Il comando di modifica di Git funziona solo se& #8217;rigorosamente aggiungendo modifiche. Quando diciamo “aggiunto,” non intendiamo solo nuove righe di codice; la modifica di una riga di codice è anche l'aggiunta di modifiche. Anche la rimozione di una riga di codice o di un intero file è una modifica aggiunta, anche se rimuove i dati dal progetto quando viene applicata tale modifica.

Tuttavia, ci sono anche casi in cui potresti voler effettivamente rimuovere le modifiche dai commit. Ad esempio, supponiamo di aver eseguito:

git add . git commit

E ha aggiunto ogni modifica nel tuo repository alle modifiche in scena, e l'ha salvata, prima di rendersene conto, “oh merda! Non volevo eseguire il commit di quel file!” In questo caso, dovresti rimandare tutte le modifiche allo staging, quindi rimuovere manualmente lo stage dai file che non vuoi inviare.

La soluzione è eseguire un ripristino, rimuovere il commit e restituire le modifiche. Esistono alcuni tipi di ripristino, ma tutti implicano l'acquisizione di commit dalla cronologia di Git e il loro reinvio allo staging, alla directory locale o direttamente nel cestino.

Pubblicità

In questo caso, un soft reset è ciò che desideri, che restituirà tutte le modifiche alla messa in scena. Puoi usare la seguente scorciatoia per ripristinare il commit dietro HEAD, altrimenti dovrai prendere il riferimento da git reflog:

git reset –soft HEAD~

Quindi, dovrai rimuovere il file che non vuoi salvare. Il modo per farlo è in realtà anche un ripristino, in questo caso, un ripristino misto su un file specifico:

git reset –mixed filename

Funziona perché il ripristino di questo file rimuoverà le modifiche dallo staging, e non verrà eseguito il commit quando rifai il commit.

Puoi anche eseguire un ripristino misto sull'intero repository e aggiungere tutti i file tranne quello che non desideri. Questo è più facile da fare se stai usando un client Git con interfaccia grafica.

Devi annullare/rimuovere un commit? Usa il ripristino

Il ripristino di un commit è il modo più semplice per rimuovere le modifiche. Fondamentalmente, prende tutte le modifiche dal commit di destinazione e applica l'opposto di esse. Se hai creato un file, questo viene rimosso. Se hai rimosso una riga di codice, quel codice viene aggiunto di nuovo. È il modo approvato da Git per “rimuovere” o “annulla” un commit, poiché l'originale è ancora conservato nella cronologia di git.

Per usarlo, esegui git log per visualizzare i commit:

git log

Copia l'ID di riferimento, quindi ripristina il commit:

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Se sei appena rimasto bloccato in vim, premi Q e magari esegui git config –global core.editor “nano”.

Usa il rebasing per qualcosa di più complicato

Il rebasing è essenzialmente un metodo per spostare i commit nel tuo repository. Invece di unire, rebase riscrive la cronologia di git per spostare i singoli commit in una nuova posizione. I commit originali vengono lasciati in sospeso e vengono rimossi dalla cronologia ufficiale di Git, sebbene siano ancora presenti in git reflog.

Annuncio

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

E se volessi tornare indietro?

Fortunatamente, Git tiene traccia di ogni singolo cambiamento, anche quando infrangi le regole e riscrivi la cronologia.

Ogni volta che il tuo suggerimento per il ramo viene aggiornato per qualsiasi motivo, Git memorizza lo stato dei contenuti della directory prima dell'aggiornamento nel Reference Log, o reflog. Puoi visualizzare il registro con git reflog:

git reflog

Molti di questi saranno commit effettivi, ma includeranno anche altre modifiche. Se hai bisogno di tornare a qualsiasi modifica individuale, puoi eseguire un hard reset:

git reset –hard fdb9db9

Questo fornisce una buona rete di sicurezza, ma dovresti essere avvertito che reflog tiene traccia solo delle modifiche che sono state effettivamente commesso, non solo messo in scena, e tiene traccia solo dei movimenti della punta del ramo. Inoltre, reflog conserva le voci solo per 90 giorni. Dopodiché, potrai solo ripristinare i commit effettivi.