2011-02-03 5 views
13

Sto usando TortoiseHg per il controllo della versione. Ho inviato il push al repository remoto dopo aver effettuato il commit sul locale. Come posso annullare un determinato punto di commit?Annullamento di una spinta Mercurial

C'erano tre distinte spinte e voglio tornare alla prima spinta. Ho letto sul rollback hg e hg annulla i comandi, ma non sono sicuro di come usarli per realizzare questo.

+0

Il fieno è l'erba lunga che è stata tagliata e asciugata, usata come cibo per il bestiame. :-) –

+1

Oltre a questo articolo è utile "[Trovare e risolvere errori] (http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html)". –

risposta

14

Poiché è stato effettuato il push su un altro repository, non è possibile sapere dove si sono propagate le modifiche. Se non avessi premuto, potresti annullare, ma annullare solo l'ultima transazione comunque.

L'altra opzione per modificare veramente la cronologia sarebbe il comando striscia, ma ancora una volta, perché hai spinto, questa non è un'opzione. Se hai spogliato il tuo locale, riavvii comunque i changeset la volta successiva che hai tirato.

Se si ha accesso alla centrale, è possibile eliminarla, ma se qualcun altro ha già effettuato le modifiche, queste verranno nuovamente visualizzate di nuovo nella centrale la volta successiva in cui vengono premute.

L'unica opzione sicura in questo momento è il comando di backout. Questo in pratica crea un nuovo changeset in punta che inverte i changeset che hai inserito accidentalmente.

2

Puoi leggere hginit.com's 'fixing goofs' page. Vuoi "ritirarti", unire e spingere. Ciò che effettivamente fa è creare un nuovo commit che esegue l'inverso delle modifiche e lo applica.

14

Da una prospettiva "puristica" Mercuriale, Mike ha ragione - ha spinto i changeset fuori dal vostro controllo. Ma, in pratica questa è spesso una prospettiva troppo rigida.

In opposizione a ciò che Mike ha detto, la rimozione dei changeset già spinti potrebbe essere un'opzione. Dipende se si ha il controllo sul repository centrale (da spogliare anche lì) e sulla dimensione della propria squadra/comunità e su come è organizzata.

Se sai per certo che nessuno ha ancora tirato i tuoi brutti cambiamenti, basta rimuovere il tuo repository locale e il repository centrale, la cronologia cancellata.

Se c'è una possibilità che qualcuno ha tirato già i tuoi gruppi di modifiche cattivi, devi avere striscia repo locale e centrale, nonché e che avrebbe dovuto notificare a tutti i membri del team che spingono per mettere a nudo i cattivi di modifiche nei loro locali pronti contro termine anche (o per recedere dal repository centrale spogliato). Se sei fortunato, ognuno fa quello che dici. Altrimenti i changeset finiranno di nuovo nel repository centrale, prima o poi.

La linea di fondo è che lo stripping potrebbe essere una soluzione per casi come il tuo - devi bilanciare i costi (sovraccaricare la tua squadra di lavoro extra) e il vantaggio (pulire la cronologia).


Un esempio pratico in cui i vantaggi superano il costo sarebbe se si aggiungessero per errore file binari di grandi dimensioni. In questo caso probabilmente ogni membro del team preferisce strisciare in modo sincrono invece di lavorare con un repository saltato.


UPDATE: È possibile utilizzare ganci laterali server per impedire changeset eliminati dal tornare in repository centrale - read more here.

+0

Hai ragione, ho preso una posizione molto 'puristica' su questo. È possibile effettuare la pulizia, e il tuo esempio è fantastico in cui vorresti sicuramente investire lo sforzo e il follow-up, richiesto. – Mikezx6r