2010-06-18 13 views
16

Entiendo las restricciones de retrotracción y el care required in its use, pero me pregunto por qué solo hay un nivel de reversión de.¿Por qué Mercurial solo tiene un nivel de reversión?

Supongo que es una decisión de diseño y que la molestia de almacenar múltiples estados transaccionales previos para manejar múltiples niveles de reversión es más problemático que su valor.

+0

Desde mi entender, su conjetura es bastante bien precisa. El camino mercurial es 'todo es inmutable' ... así que si necesitas revertir algo que cometiste 8 revisiones atrás, la forma 'hg' es introducir un nuevo cambio que lo haga. –

Respuesta

13

Solo hay un nivel de retrotracción porque la reversión nunca fue realmente una función. Rollback existe, y tiene un nombre extraño, porque surgió del sistema de transacción commit/push/pull de mercurial.

Si entra una inserción de red y se hace un 99% y luego se pierde la conexión, el repositorio no se debe dejar en un estado incoherente. Para asegurarse de que un cambio incompleto puede descartarse, se crea un puntero "antes de que ocurra nada" antes de que se realice cualquier escritura y, si el cambio se cancela, todo se restablece a ese estado, retrocedido.

El comando rollback simplemente está "fallando" la operación anterior después de que se completó correctamente. Es algo que "salió gratis" después de que se diseñó la seguridad transaccional necesaria.

Cuando se utiliza algo como controlling hook, se pueden definir verificaciones/pruebas que deben pasarse para que un empuje o compromiso se complete satisfactoriamente. Para no completar correctamente, debe ser posible deshacer esa confirmación en curso, pero eso tampoco requiere niveles múltiples.

Como VonC nota correctamente la reversión puede ser bastante peligroso. Muchos cambios de retroceso de una persona que ya han empujado y luego se confunden mucho cuando otros cambios vuelven en tiradas posteriores. El comando hg backout es casi siempre una mejor idea.

también señalan que puede simular un retroceso a cualquier punto en el tiempo fácilmente al hacer esto:

hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff 
5

El truco es: hg rollback no se trata solo de restablecer algunas confirmaciones, restablecer todos los datos y metadatos asociados con el repositorio.
En realidad tiene no equivalent in Git, y es un mecanismo bastante peligroso.
Se puede usar incorrectamente como una forma de reescribir el historial reiniciándolo, y que can "reset" more than you wanted.
Permitir esto en más de un nivel de vuelta sería demasiado peligroso.

Cuando se trata solo de resetting/rewriting changeset (que son, por diseño, inmutables), extensions like MQ son más adecuados.

+0

Estoy de acuerdo, definitivamente algo que debo evitar, uso MQ así que nunca me llamó para usarlo. Simplemente parece una limitación extraña: si vas a permitirlo, ¿por qué no permites más de un nivel de reversión? –

Cuestiones relacionadas