2009-07-03 14 views

Respuesta

50

ADVERTENCIA: una "combinación ficticia", tal como lo recomienda @Martin_Geisler, puede realmente arruinarlo, si luego desea realizar una fusión real de las dos ramas. La fusión ficticia se registrará y supondrá que se fusiona con la rama a la que se unió el dummy: no verá los cambios. O si se fusiona con la otra rama, los cambios en esa otra rama se desharán.

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.

Acabo de hacer esto en mi directorio personal .hgignore.

Si ambas ramas han realizado cambios en un archivo que desea conservar, un truco sucio sería crear una fusión de las dos ramas usando hg merge, posiblemente/probablemente en otra rama, marcar eso, y luego copiar un archivo único 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 revertir". 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, encuentran esta muy confuso. "revertir" == "copiar" ... tiene sentido para algunos patrones de uso, pero no todos.

+2

Esta debería ser la respuesta aceptada en lugar de el que dio Martin Geisler. Aunque en realidad no fusionará el archivo, copiarlo es lo que uno querrá hacer la mayor parte del tiempo y no estropeará la rama. – noamik

+2

Esto funcionó muy bien para traer un solo archivo de una rama a el tronco. Sin embargo, una cosa que noto es que el registro en el maletero no aparece en el historial del archivo, lo cual es desafortunado. –

+0

hola y gracias por su respuesta. Sin embargo, estoy teniendo problemas, en mi situación mi fuente de la rama contiene un archivo que no existe en mi rama predeterminada, pero quiero copiarlo sin fusionar el resto de la rama. Cuando trato de hacer lo que describí, obtengo 'ningún archivo en rev' ¿Alguna sugerencia? – propagated

18

Nope. Mercurial funciona en base a un conjunto de cambios.

Pero puede hacer un "dummy merge" donde ignora 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 va a ayudar un poco.

+2

ADVERTENCIA: una "ficticia de combinación" tal que realmente puede estropear hasta , si luego quieres hacer una verdadera fusión de las dos ramas. La fusión ficticia se registrará y supondrá que se fusiona con la rama a la que se unió el dummy: no verá los cambios. O si se fusiona con la otra rama, los cambios en esa otra rama se desharán. // Si todo lo que quiere es copiar un archivo completo de una rama a otra, simplemente puede "hg actualizar -r a-branch; hg revertir -r archivo" // si desea seleccionar diferentes partes de ese archivo , entonces "hg record" es útil. // Acabo de hacer esto en mi directorio de inicio .hgignorar. –

+0

Un truco sucio sería crear una combinación de las dos ramas usando hg merge, verificar eso y luego copiar un solo archivo entre la combinación y la rama con "hg update -t ​​to-branch; branch merge-branch ; hg merge -r from-branch; hg ci -m 'fusión temporal para descartar "; hg update -r to-branch; hg revertir -r merge-branch single-file-u-want; hg ci -m 'archivo único fusionado de from-branch a to-branch "; hg strip merge-branch. –

+1

Oh, diablos, también podría hacer que mis comentarios en una respuesta real. –

1

Solo utilizaría una herramienta externa como vimdiff para distinguir los dos archivos que quiero fusionar y luego fusionarlos. La ventaja de esto es que puede hacer una edición selectiva en partes del archivo. Por ejemplo:

hg update -r branch-merging-to 
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging 

Para hacer esto es necesario tener las herramientas externas en su .hgrc, que sólo significa la adición de estas líneas:

[extensions] 
hgext.extdiff = 
Cuestiones relacionadas