¿Es posible fusionar solo los cambios para un subdirectorio de una rama de Git local a una rama de Git remota o es "todo o nada"?
Por ejemplo, tengo:
branch-a
- content-1
- dir-1
- content-2
y
branch-b
- content-1
- dir-1
- `content-2
Solo quiero fusionar el contenido de branch-a dir-1 con el contenido de branch-b dir-1.
Respuestas:
Solo como una alternativa a la pregunta SO " ¿Cómo fusionar archivos selectivos con git-merge? ", Acabo de encontrar este hilo de GitHub que podría adaptarse mejor para fusionar un subdirectorio completo, basado en git read-tree :
(esto realiza una fusión utilizando la estrategia 'nuestro' (
-s ours
), que descarta los cambios de la rama de origen. Esto registra el hecho de queinfochimps/master
se ha fusionado, sin modificar ningún archivo en la rama de destino)Esto lee el árbol solo para el subdirectorio fuente requerido
cookbooks/cassandra
, es decir , en la rama ascendente del repositorio fuente .Tenga en cuenta que el nombre del subdirectorio de destino también debe ser
cookbooks/cassandra
, o verá:Apéndice
Es extraño, [edítame] , pero es posible que el
read-tree
paso falle así:... incluso cuando ambos archivos son idénticos . Esto podría ayudar:
Pero, por supuesto, verifique manualmente que esto hace lo que quiere.
fuente
<rev>:<path>
, por ejemploHEAD:README
,:README
,master:./README
git read-tree
paso me falla:error: Entry 'foo/bar/baz.php' overlaps with 'bar/baz.php'. Cannot bind.
overlaps with
error mencionado anteriormente también aparece en archivos idénticos . ¿Qué tan raro es eso?infochimps/master
se ha fusionado, pero sin modificar ningún archivo en la rama de destino. Porque el siguiente pasogit read-tree --prefix=cassandra
hará la modificación. La confirmación final registrará el contenido de "fusión" real.Para mi ejemplo, suponga que tiene una 'fuente' de rama y un 'destino' de rama que reflejan versiones ascendentes de sí mismos (o no, si solo son locales) y se extraen del código más reciente. Digamos que quiero el subdirectorio en el repositorio llamado newFeature que solo existe en la rama 'fuente'.
Es significativamente menos complicado que todo lo demás que he visto y esto funcionó perfectamente para mí, que se encuentra aquí .
Tenga en cuenta que esta no es una 'combinación real', por lo que no tendrá la información de confirmación sobre newFeature en la rama de destino, solo las modificaciones a los archivos en ese subdirectorio. Pero como es de suponer que volverá a fusionar toda la rama más tarde, o la descartará, es posible que eso no sea un problema.
fuente
Obtuve esto de un hilo del foro en Eclipse y funcionó como un encanto:
fuente
checkout
hace que las carpetas sean iguales => la diferencia es solo un-checkout
folder =>merge
diferencia Es una estrategia válida.Dado el escenario del OP en el que tienen dos ramas, pero quieren fusionar solo el historial de dir-1 de branch-a en branch-b :
fuente
Cree un repositorio de Git para contener tanto branch-a como branch-b:
fuente
Utilice
git cherry-pick
para seleccionar las confirmaciones que desee y fusionar solo estas confirmaciones. El truco clave aquí es obtener estas confirmaciones de una manera fácil (para que no tenga que averiguarlas revisando manualmente el registro de Git e ingresándolas a mano). He aquí cómo: usegit log
para imprimir la identificación SHA-1 de la confirmación , así:'commit-a' es la confirmación inmediatamente antes del punto de inicio de la rama para fusionar, y 'commit-b' es la última confirmación en la rama para fusionar. '--reverse' imprime estas confirmaciones en orden inverso para seleccionarlas más adelante.
Entonces hazlo como:
¡Son dos pasos, simple y estable!
fuente
Two steps, simple and stable!
nada simple :)git
, que tiene una interfaz terrible y un modelo mental terrible lleno de misterios y nombres y significados aleatorios.