mercurial rollback

En mercurial, ¿cómo aplico un parche inverso a un archivo en particular?



rollback (3)

Esto es lo que haría: usar un clon nuevo de la revisión de la propina.

hg backout --merge -r revision_where_the_change_happened

fusionar los cambios invertidos en la copia de trabajo.

Ahora copie el archivo en cuestión a su copia de trabajo normal y comprométalo

hg commit -m "Reversed the changes to file.h made in revision bla"

y tira el clon que creaste arriba.

De esta forma, mercurial no sabe que existe una conexión entre revision_where_the_change_happened y this commit. Si desea que mercurial lo recuerde, en su lugar, haga una

hg revert {all files except the one in question}

después de fusionar la confirmación de restitución en la copia de trabajo y antes de comprometerse. Para la segunda forma, no necesita trabajar en un clon, porque desea mantener el compromiso de restitución.

Supongo que la elección de la forma de usar depende de cuán grande sea la parte del conjunto de cambios que fue el cambio del archivo en particular.

Relacionado con Mercurial: fusionando un archivo entre ramas en un repositorio , estoy tratando de realizar una operación de retroceso en un solo archivo, a pesar de que ese archivo fue uno de los muchos participantes en la revisión que se retiró.

HG es la herramienta orientada al conjunto de cambios que es, no quiere operar en archivos.

Lo más cerca que pude encontrar fue usar hg export para crear un diff, editar a mano el diff, y luego importarlo para parchar el archivo en orden inverso.

... pero luego llegué a esta situación molesta donde http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html afirma que hay una opción --reverse a hg patch cuando no lo hay.

Entonces, lo más cercano que puedo pensar es generar un parche editado a mano como el anterior, y luego usar el parche vainilla -R para aplicar un parche inverso.

El comando de hg backout parece ser útil aquí, pero en realidad es una hg backout falsa.

Tiene que haber una mejor manera, ¿no?


Use el comando de revertir.

hg revert -r1 file

Esto debería revertir el contenido del archivo a la versión en la revisión 1. Luego puede editarlo y comprometerse normalmente.


Puedes hacerlo usando solo el argumento -I (incluir nombres que coincidan con los patrones dados) para retroceder con una sola línea:

hg backout --merge -I thefiletorevert -m ''message'' OFFENDINGREVISIONID

Ejemplo de secuencia de comandos:

hg init testrepo cd testrepo echo -e "line1/n/nline3" > file1 echo -e "line1/n/nline3" > file2 hg commit -A -m ''changes to two files'' perl -pi -e ''s/line1/line 1/'' file1 perl -pi -e ''s/line1/line 1/'' file2 hg commit -m ''put spaces in line1'' perl -pi -e ''s/line3/line 3/'' file1 perl -pi -e ''s/line3/line 3/'' file2 hg commit -m ''put spaces in line3'' hg backout --merge -I file1 -m ''remove spaces from line1'' 1

Muestra de salida:

adding file1 adding file2 reverting file1 created new head changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3 merging with changeset 3:6d354f1ad4c5 merging file1 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don''t forget to commit)

Contenido resultante del archivo:

file1:line1 file1:line 3 file2:line 1 file2:line 3

observe que falta el archivo 1, es espacio en la línea uno después del retroceso del conjunto de cambios del medio, y el registro detallado muestra solo un archivo modificado en el retroceso:

$ hg log -v -r tip changeset: 3:6d354f1ad4c5 tag: tip parent: 1:906bbeaca6a3 user: Ry4an Brase <ry4an@mini> date: Mon Sep 14 12:17:23 2009 -0500 files: file1 description: remove spaces from line1