Mercurial: La fusión de un archivo entre las ramas en una cesión temporal
-
21-08-2019 - |
Pregunta
Cuando tengo dos sucursales en Hg repo, cómo combinar un único archivo con otra rama, sin tener todos los demás archivos de cambios mezclado?
¿Es posible fusionar sólo ciertos archivos, en lugar de todo conjunto de cambios?
Solución
ADVERTENCIA: una "fusión ficticia" tal como se recomienda por @Martin_Geisler, puede realmente lío que hasta, si es más tarde que desea hacer una verdadera fusión de las dos ramas. La fusión ficticia se grabará, y decir que se funden en la rama que hizo la fusión ficticia a - no verá los cambios. O si se funden en la otra rama, se desharán los cambios de esa otra rama.
Si lo que quieres es copiar un archivo completo de una rama a otra, sólo tiene que hacer:
hg update -r to-branch
hg revert -r from-branch file
hg ci -m 'copied single file from from-branch to to-branch
Si desea seleccionar diferentes partes de ese archivo, a continuación, "hg record"
es útil.
Me acabo de hacer esto en mi directorio .hgignore.
Si ambas ramas han realizado cambios en un archivo que desea mantener, una mala pasada sería la de crear una combinación de las dos ramas usar la fusión de Hg, posiblemente / probablemente en otra rama, comprobar que en, y luego copiar un único archivo entre la fusión y la rama a:
hg update -r to-branch
branch merge-branch
hg merge -r from-branch
hg ci -m 'temp merge to be discarded"
hg update -r to-branch
hg revert -r merge-branch single-file
hg ci -m 'merged single-file from from-branch to to-branch"
hg strip merge-branch
Vale la pena mencionar: el camino a "copiar un archivo único entre las ramas" (o revisiones, o de revisión a fusionar, o ....) es "hg revert". Es decir.
hg update -r Where-you-want-to-copy-to
hg revert -r Where-you-want-to-copy-from file-you-want-to-copy
...
hg ci
Por alguna razón, y algunos de mis compañeros de trabajo, parece que este muy confuso. "Revertir" == "copia" ... tiene sentido para algunos patrones de uso, pero no todos.
Otros consejos
Nop. Mercurial trabaja sobre una base de cambios.
Pero se puede hacer una " fusión ficticia ", donde se ignoran los cambios entrantes de una de las ramas. Antes de comprometerse a continuación, podría revertir los archivos seleccionados a cualquier estado que desee:
% HGMERGE=internal:local hg merge # keep my files
% hg revert --rev other-branch a.txt # update a.txt to other branch
% hg commit -m 'Dummy merge to pick a.txt from other-branch.'
Tal vez eso le ayudará un poco.
Me acaba de utilizar una herramienta externa como vimdiff
diff los dos archivos que desea combinar y luego fusionarlas. La ventaja de esto es que se puede hacer una edición selectiva de partes del archivo. Por ejemplo:
hg update -r branch-merging-to
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging
Para ello es necesario tener las herramientas externas en su .hgrc, que sólo significa la adición de estas líneas:
[extensions]
hgext.extdiff =