Annullare una determinata commit in Git che è stato spinto a repos remoti
-
22-09-2019 - |
Domanda
Qual è il modo più semplice per annullare una particolare commit che è:
- non nella testa o HEAD
- è stato spinto al telecomando.
Perché non se è l'ultimo commit,
git reset HEAD
non funziona. E perché è stato spinto a un telecomando,
git rebase -i
e
git rebase --onto
causerà qualche problema con i telecomandi.
Più così, non voglio modificare la storia davvero. Se ci fosse il codice cattivo, era lì nella storia e può essere visto. Voglio solo che nella copia di lavoro, e non mi dispiace una fusione inversa commesso.
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 fondendo 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 commit.
ho pensato che dovrebbe essere un'operazione abbastanza semplice in Git e un caso d'uso abbastanza comune. Che altro è il punto di commit atomici?
Abbiamo messa in scena stashing e tutto per garantire i commit sono perfettamente atomico, non si dovrebbe essere in grado di annullare uno o più di tali commit atomici facilmente?
Soluzione
Identificare l'hash del git log
impegnarsi, utilizzando git revert <commit>
, quindi utilizzare per creare un nuovo commit che rimuove questi cambiamenti. In un certo senso, git revert
è il contrario della git cherry-pick
- quest'ultimo si applica la patch per un ramo che manca è, il primo rimuove da un ramo che ha
Altri suggerimenti
Non mi piace l'auto-commit che git revert
fa, 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>
perché è già stato spinto, non si deve manipolare direttamente la storia. git revert
tornerà modifiche specifiche da un commit utilizzando un nuovo commit, in modo da non commettere manipolare la storia.