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

19

Relacionado conMercurial: fusionando un archivo entre ramas en un repositorio Estoy intentando 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 está eliminando.

HG es la herramienta orientada a los cambios que es, no quiere operar en archivos.

Lo más cercano que pude encontrar fue usar hg export para crear un diff, editar manualmente el diff, y luego hg import para parchear el archivo en orden inverso.

..pero entonces llegué a esta situación molesta dondehttp://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html afirma que hay una opción --reversa ahg patch cuando no hay

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

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

Tiene que haber una mejor manera, no?

La opción --reverso esparchenoparche de hg. balpha

Tu respuesta

3   la respuesta
6

Use un clon nuevo de la revisión de la punta.

hg backout --merge -r revision_where_the_change_happened

para fusionar los cambios invertidos en la copia de trabajo.

Ahora copie el archivo en cuestión a su copia de trabajo normal y confirme

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

y tira el clon que creaste arriba.

De esta manera, Mercurial no sabe que existe una conexión entrerevision_where_the_change_happened y este cometer. Si quieres que Mercurial recuerde esto, haz un

hg revert {all files except the one in question}

después de fusionar el compromiso de retroceso en la copia de trabajo y antes de cometer. Para la segunda forma, no necesita trabajar en un clon, porque desea mantener el compromiso de retroceso.

Supongo que la elección de la forma en que se usa depende de qué tan grande sea la parte del conjunto de cambios que fue el cambio del archivo en particular.

3

Utilice el comando revertir.

hg revert -r1 file

Esto debería revertir el contenido del archivo a la versión en la revisión 1. A continuación, puede editarlo y confirmarlo de forma normal.

Es correcto que pueda restablecer un archivo a una versión anterior como esa. Incluso funcionaría aquí si el archivo no se ha cambiado desde la versión incorrecta. Pero si se han hecho más ediciones, entonces una revertida simple no funcionará. En su lugar, tendría que actualizar a la revisión incorrecta, revertir el archivo a una buena versión, hacer un compromiso y combinar las dos cabezas. Creo que esto es básicamente lo que hace el retroceso para ti. Martin Geisler
22

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

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

Ejemplo de guión:

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

Salida de muestra:

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 en su espacio en la línea uno después del retroceso del conjunto de cambios intermedio, y que el registro detallado muestra solo un archivo cambiado en el retroceso:

$ hg log -v -r tip
changeset:   3:6d354f1ad4c5
tag:         tip
parent:      1:906bbeaca6a3
user:        Ry4an Brase <[email protected]>
date:        Mon Sep 14 12:17:23 2009 -0500
files:       file1
description:
remove spaces from line1
retrocediendo al conjunto de cambios medio Ry4an Brase
Guay. Si tuviera que publicar un ejemplo con el respaldo de un cambio oculto, lo marcaría como correcto. djsadinoff
Creo que entiendo esta solución, pero este caso parece más simple que el mío, ya que aquí está retrocediendo (uno de los archivos) el cambio de punta, mientras que balpha se ocupa de mi caso más general de retroceder un cambio histórico. djsadinoff
No, esto funcionaría bien para un conjunto de cambios que no sea de punta, aunque requeriría que 'hg merge' al final. Sin embargo, aún terminaría con un gráfico de historial que refleje con precisión lo que sucedió y cambió de parentesco, a diferencia del copy-it-over de balpha, que produciría un registro de cambios lineal. Ry4an Brase

Preguntas relacionadas