Git: come eseguire l'unione inversa di un commit?


124

Con SVN è facile unire al contrario un commit, ma come farlo con Git?



Non credo che questo sia ciò che si intende con la domanda. Un'unione inversa in SVN ripristina anche le modifiche dal commit alle modifiche locali, quindi puoi modificarle e eseguire nuovamente il commit.
Dormouse

Risposte:


105

Per creare un nuovo commit che "annulli" le modifiche di un commit passato, usa:

$ git revert <commit>

È anche possibile rimuovere effettivamente un commit da un punto arbitrario in passato ribasandolo e quindi ripristinandolo, ma davvero non vuoi farlo se hai già trasferito i tuoi commit in un altro repository (o qualcun altro ti ha estratto) .


31
Probabilmente sarà necessario fornire -m <parent number>un'opzione a git revertper specificare quale modifica annullare. Se vuoi annullare un'unione della cronologia non pubblicata, usa git reset --hard HEAD^1.
Jakub Narębski,

3
Jakub: questo è vero se stai annullando un merge commit, ma nella terminologia di Subversion, "reverse-merge" è in realtà semplicemente il nome per ripristinare qualsiasi tipo di commit.
Ben James

4
Tieni presente che l'utilizzo -msignifica che un'unione futura dal ramo non unito non includerà le modifiche da prima di quell'unione! Vedi schacon.github.com/git/howto/revert-a-faulty-merge.txt per i modi corretti per riunire un ramo non unito.
Martijn Pieters

125

Per ripristinare un merge commit, è necessario utilizzare: git revert -m <parent number>. Quindi, ad esempio, per ripristinare il commit di unione più recente utilizzando il genitore con il numero 1, useresti:

git revert -m 1 HEAD

Per ripristinare un commit di unione prima dell'ultimo commit, dovresti fare:

git revert -m 1 HEAD^

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

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

discussione su git merge (confusa ma molto dettagliata): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
Come puoi ottenere il "numero" associato al genitore? I rami hanno un "id" numerico intrinseco?
daniyalzade

7
Utilizzare git show <merge commit SHA1>per vedere i genitori, la numerazione è l'ordine in cui appaiono, ad esempioMerge: e4c54b3 4725ad2
supermetodo

8
esempio: git revert -m 1 SHA1quel comando ha funzionato per me per annullare un commit di unione che era diversi commit di unione prima di head e aveva molti commit al di sotto.
c.apolzon

3
Quali sono i genitori? E4c54b3 o 4725ad2?
Dolphin

1
Questo ancora non fornisce informazioni sufficienti su come i risultati di git show si riferiscono ai numeri dei genitori. L '"ordine in cui appaiono" è 1? 0-based? In questo esempio specifico, qual è lo SHA1 del genitore 1? e4c54b3 o 4725ad2?
cowlinator

4

Se ti ho capito bene, stai parlando di fare un file

svn merge -rn:n-1

per tornare indietro da un commit precedente, nel qual caso probabilmente stai cercando

git revert

0
git reset --hard HEAD^ 

Utilizzare il comando precedente per annullare le modifiche di unione.


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

-1

Se non vuoi eseguire il commit o desideri eseguire il commit in un secondo momento (il messaggio di commit sarà ancora preparato per te, che puoi anche modificare):

git revert -n <commit>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.