Come annullare un merge in git

Guida su come annullare un merge in git.

Pubblicato:

TL;DR

# Per i merge che sono avvenuti solo in locale
git reset --hard <hash-commit-before-merge>
git reset --hard HEAD~1
# Per i merge committati nel repository remoto
git revert -m 1 <hash-merge-commit>
# Per recuperare l'hash
git log --oneline
git reflog

Introduzione

Capita spesso di aver mergiato sul branch sbagliato, di trovare conflitti durante il merge o semplicemente di voler annullare le ultime modifiche.

Per fortuna, con git è semplice farlo: bastano pochi comandi. Vediamo come:

  1. Con git reset: per i merge avvenuti solo in locale.
  2. Con git revert: per i merge che sono già stati committati nel repository remoto.

Per i merge avvenuti solo in locale

Per i merge avvenuti solo in locale, bisogna usare il comando:

git reset --hard <hash-commit-before-merge>

--hard significa che verranno resettati l'indice e la working directory, e perderai le modifiche non committate. Ti consiglio di non avere modifiche in corso oppure di creare un branch di backup se non sei sicuro, o di fare un git stash. Altrimenti, se hai delle modifiche in corso, puoi usare il flag --merge al posto di --hard.

<hash-commit-before-merge> deve essere sostituito con l'hash del commit avvenuto prima del merge.

Per recuperare l'hash ci sono diversi metodi:

Primo metodo

git log --oneline

Secondo metodo

git reflog

Tips:
Digita q nella console per uscire dal visualizzatore di git dopo aver eseguito i comandi e tornare alla console.

Ora che hai recuperato l'hash, che dovrebbe essere in questo formato ff29edf, devi sostituirlo con <hash-commit-before-merge>.

Esempio:

git reset --hard 2ad44e7

Se il merge è stata l'ultima operazione, puoi anche usare il comando:

git reset --hard HEAD~1

Utile se il merge è stato fatto per errore.

HEAD~1 in Git si riferisce al commit immediatamente precedente al commit corrente (HEAD).

Per i merge committati nel repository remoto

Sei stai lavorando con un repository remoto ed hai commitato delle modifiche mi dispiace per te ma sei fregato!!!

No scherzo in questo caso si usa il comando:

git revert -m 1 <hash-merge-commit>

Ci sono delle differenze rispetto a git reset: con git revert verrà creato un nuovo commit che sarà presente nella cronologia, a differenza di git reset dove semplicemente cancelliamo il commit e non ci sarà traccia nella cronologia. Inoltre, per l'hash, dobbiamo usare l'hash del merge commit, a differenza di git reset dove usiamo l'hash del commit prima del merge.

Usa git log --oneline o git reflog per recuperare l'hash.

-m 1 indica a Git di annullare il commit di merge considerando il primo genitore come principale.