2010-06-18 7 views
16

Comprendo le restrizioni del rollback e dello care required in its use, ma mi sono semplicemente chiesto perché c'è solo il livello di uno rollback.Perché Mercurial ha solo un livello di rollback?

Suppongo che sia una decisione di progettazione e che la seccatura di archiviare più stati transazionali precedenti per gestire più livelli di rollback sia più difficile del suo valore.

+0

Dalla mia comprensione, la tua ipotesi è abbastanza ben preciso. Il modo mercuriale è "tutto è immutabile" ... quindi se hai bisogno di ripristinare qualcosa che hai impegnato 8 revisioni fa, il modo "hg" è introdurre un nuovo cambiamento che lo faccia. –

risposta

13

C'è un solo livello di rollback perché il rollback non è mai stato concepito come una funzionalità. Il rollback esiste, e ha il suo nome strano, perché è nato dal sistema di transazione commit/push/pull di Mercurial.

Se arriva una spinta di rete e si ottiene il 99% e quindi la connessione viene persa, il repository non deve essere lasciato in uno stato incoerente. Per assicurarsi che un cambiamento incompleto possa essere scartato, un puntatore "prima che qualcosa accadesse" viene creato prima che vengano eseguite le scritture e se la modifica viene interrotta, tutto viene reimpostato su tale stato - viene eseguito il rollback.

Il comando rollback è in realtà solo "non riuscito" l'operazione precedente dopo che è stata completata correttamente. È solo qualcosa che "è venuto gratis" dopo che è stata progettata la necessaria sicurezza transazionale.

Quando si utilizza qualcosa come un controlling hook si possono definire assegni/test che devono essere passati in modo che un push o un commit vengano completati correttamente. Per non completare correttamente, deve essere possibile annullare tale commit in corso, ma non richiede neanche più livelli.

Come VonC correttamente note il rollback può essere piuttosto pericoloso. Molte modifiche ai rollback di una persona che hanno già spinto e poi diventano molto confuse quando altre modifiche ritornano nelle estrazioni successive. Il comando hg backout è quasi sempre un'idea migliore.

Si noti inoltre che è possibile simulare un rollback a qualsiasi punto nel tempo facilmente in questo modo:

hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff 
5

Il trucco è: hg rollback non si tratta solo di reimpostare alcuni commit, ma di ripristinare tutti i dati e i metadati associati al repository.
In realtà ha no equivalent in Git ed è un meccanismo abbastanza pericoloso.
Può essere utilizzato in modo errato come modo per riscrivere la cronologia resettandola e che can "reset" more than you wanted.
Per consentire questo su più di un livello di schiena sarebbe troppo pericoloso.

Quando si tratta solo di resetting/rewriting changeset (che sono, per definizione, immutabili), extensions like MQ sono più adatti.

+0

Sono d'accordo - sicuramente qualcosa da evitare - Io uso MQ quindi non è mai qualcosa che ho avuto chiamata da usare. Sembra solo una strana limitazione - se hai intenzione di permetterti del tutto perché non consentire più di un livello di rollback. –

Problemi correlati