2009-11-27 17 views
90

Con SVN è facile unire inverso un commit, ma come farlo con Git?Git: come invertire-unire un commit?

+0

duplicati di [Ripristinare un Git commit precedente ] (http://stackoverflow.com/questions/4114095/revert-to-a-previous-git-commit) –

+0

Non penso che questo sia il significato della domanda. Un'unione inversa in SVN ripristina anche le modifiche dal commit alle modifiche locali, quindi puoi modificarle e eseguire nuovamente il commit. – Dormouse

risposta

92

Per creare un nuovo commettono che annulla l'operazione di '' i cambiamenti di un passato impegnano, uso:

$ git revert <commit> 

E 'anche possibile in realtà rimuovi un commit da un punto arbitrario in passato rebasando e poi reimpostando, ma in realtà non vuoi farlo se hai già trasferito i tuoi commit in un altro repository (o qualcun altro ha tirato da te).

+25

Probabilmente dovresti fornire l'opzione '-m ' a 'git revert' per specificare quale modifica ripristinare. Se si desidera annullare un'unione di cronologia non pubblicata, utilizzare 'git reset --hard HEAD^1'. –

+2

Jakub: questo è vero se si sta ripristinando un commit di unione, ma nella terminologia di Subversion, "reverse-merge" è in realtà semplicemente il nome per ripristinare qualsiasi tipo di commit. –

+4

Notate che usare '-m' significa che una futura fusione dal ramo non unito non includerà le modifiche precedenti alla fusione! Vedi http://schacon.github.com/git/howto/revert-a-faulty-merge.txt per i modi adeguati di riunire nuovamente un ramo non unito. –

4

Se ho capito bene, si sta parlando di fare un

svn merge -rn:n-1 

per tornare indietro di un precedente impegno, in questo caso, probabilmente siete alla ricerca di

git revert 
84

Per annullare un commit di unione, è necessario utilizzare: git revert -m. Così, per esempio, per ripristinare il recente più fondono impegnarsi con il genitore con il numero 1 si usa:
git revert -m 1 HEAD

Per ripristinare un merge commit prima dell'ultima commit, si dovrebbe fare:
git revert -m 1 HEAD^

Usa git show <merge commit SHA1> per vedere i genitori, la numerazione è l'ordine in cui appaiono ad es Merge: e4c54b3 4725ad2

git documentazione merge: discussione http://schacon.github.com/git/git-merge.html

git merge (confusione, ma molto dettagliato): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

+28

Come si può ottenere il 'numero' associato al genitore? I rami hanno un 'id' numerico intrinseco? – daniyalzade

+6

Usa 'git show ' per vedere i genitori, la numerazione è l'ordine in cui appaiono ad es. 'Unisci: e4c54b3 4725ad2' – supermethod

+4

esempio:' git revert -m 1 SHA1' Questo comando ha funzionato per ripristinare un commit di unione che era più commit di commit prima della testa e aveva molti commit sotto. –

-2
git reset --hard HEAD^ 

Utilizzare il comando precedente per ritornare unire le modifiche.

+2

Questo elimina il commit unione, che non fa ciò che il poster originale sta chiedendo. L'OP sta cercando di eseguire una patch inversa per annullare le modifiche precedenti, non cancellare completamente la cronologia delle modifiche precedenti. –

-1

Se non si vuole impegnare, o vogliono impegnarsi in seguito (messaggio di commit sarà ancora preparato per voi, che si può anche modificare):

git revert -n <commit>