2010-11-30 16 views
6

Tengo un gran compromiso de muchos archivos en una rama, necesito transferir las modificaciones de un solo archivo en ese conjunto de cambios a otra rama. ¿Cómo puedo hacer esto? Uso principalmente TortoiseHg, pero las soluciones de línea de comandos también están bien.En Mercurial, ¿cómo puedo extraer los cambios de un solo archivo de un conjunto de cambios para aplicarlo a otra rama?

Si voy al conjunto de cambios en TortoiseHg y selecciono el archivo, puedo ver los difs que quiero transferir, pero no una forma de aplicarlos realmente.

Respuesta

8

Usted puede obtener el parche por sólo ese archivo usando:

hg log -r THEREVISIONWITHLOTSOFCHANGES -p -I path/to/justthatfile > justthatfile.patch 

que luego se puede importar en cualquier rama que desea haciendo:

hg update anotherbranch 
hg import --no-commit justthatfile.patch 
hg commit 
2

La solución más básica consiste en mover el parche del archivo, que se aplican a la revisión de trabajo actual y cometerlo (asumiendo que usted está en la raíz del repositorio):

$ hg up <revision-to-apply-the-patch-to> 
$ hg diff -c <revision-containing-the-patch> <files-to-include> | patch -p0 
$ hg ci -m "Transplanting selected changes from <revision-contain...>" 

El inconveniente de este método es que no es muy obvio lo que has hecho desde la perspectiva del historial de revisiones. Un buen mensaje de compromiso ayuda aquí, pero el gráfico de historial no da ninguna pista sobre el proceso de trasplantar algunos cambios. En ese caso, la fusión y la reversión puede ser una solución mejor:

$ hg up <revision-to-apply-the-patch-to> 
$ hg merge -r <revision-containing-the-patch> 
$ hg revert --no-backup <files-to-exclude> 
$ hg ci -m "Merge in changes of <files-to-include>" 

Probablemente hay más soluciones para hacer esto - estos dos vinieron a mi mente en primer lugar.

Cuestiones relacionadas