2010-02-23 16 views
562

Qual è il modo più semplice per annullare un particolare commit che è:annullare una particolare commit in Git che è stato spinto a pronti contro termine a distanza

    non
  • nella testa o la testa
  • è stato spinto al telecomando.

Perché se non è l'ultimo commit,

git reset HEAD 

non funziona. E poiché è stato spinto ad un telecomando,

git rebase -i 

e

git rebase --onto 

causerà qualche problema nei telecomandi.

Più così, non voglio modificare davvero la cronologia. Se c'era codice cattivo, era lì nella storia e può essere visto. Lo voglio solo nella copia di lavoro, e non mi interessa un commit di inversione inversa.

In altre parole, qual è il Git equivalente dei seguenti comandi svn:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk 

che rimuove tutte le modifiche da 295 a 302 di fusione inversa tutte le variazioni di tali modifiche, come nuovo commit.

svn merge -c -302 ^/trunk 

che annulla l'commit 302, naturalmente aggiungendo un altro commit che inversa unisce le modifiche da quel rispettivo impegnano.

Ho pensato che dovrebbe essere un'operazione abbastanza semplice in Git e un caso d'uso abbastanza comune. Cos'altro è il punto dei comandi atomici?

Abbiamo messo in scena stashing e tutto per garantire che i commit siano perfettamente atomici, non dovresti essere in grado di annullare facilmente uno o più di questi comandi atomici?

risposta

877

Identificare l'hash del commit, utilizzando git log, quindi utilizzare git revert <commit> per creare un nuovo commit che rimuove questi cambiamenti. In un certo senso, git revert è il contrario di git cherry-pick - quest'ultimo applica la patch a un ramo che lo manca, il primo lo rimuove da un ramo che lo ha.

+174

E utilizzare l'opzione -n ​​se si desidera il codice indietro, ma non viene eseguito automaticamente il commit di nuovo – jaygooby

+9

Cosa fa l'opzione "m"? Ho provato git revert 8213f7d ma ho ottenuto questo: error: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 è una fusione ma non è stata data l'opzione -m. fatale: ripristino fallito – Malcolm

+1

'git help revert' dice che ti permette di scegliere quale genitore dell'unione vuoi tornare indietro. Non è possibile ripristinare un'unione senza selezionare un genitore. La documentazione rimanda a https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-ultyulty-merge.txt –

32

Poiché è già stato premuto, non è necessario manipolare direttamente la cronologia. git revert ripristina le modifiche specifiche da un commit utilizzando un nuovo commit, in modo da non manipolare la cronologia del commit.

266

Non mi piace il commit automatico di git revert, quindi questo potrebbe essere utile per alcuni.

Se si desidera solo i file modificati non l'auto-commit, è possibile utilizzare --no-commit

% git revert --no-commit <commit hash> 

che è lo stesso del -n

% git revert -n <commit hash> 
+6

Si potrebbe anche fare 'git reset HEAD ~ 1 --soft' se è già stato ripristinato senza' -n' – Daniel

+1

Ma 'git reset HEAD ~ n' non risolverà l'annullamento di alcun commit non continuamente raggiungibile da La domanda è di ripristinare qualsiasi commit particolare. – sangeethkumarp

Problemi correlati