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