git - crear - ¿Cómo fusiono cambios en un solo archivo, en lugar de fusionar confirmaciones?
git pull (7)
El siguiente comando (1) comparará el archivo de la rama correcta, con master (2) le preguntará interactivamente qué modificaciones aplicar.
git checkout --patch master
Tengo dos sucursales (A y B) y quiero fusionar un solo archivo de la sucursal A con un solo archivo correspondiente de la sucursal B.
Esto es lo que hago en estas situaciones. Es un kludge pero funciona bien para mí.
- Crea otra rama basada en tu rama de trabajo.
- git pull / git fusiona la revisión (SHA1) que contiene el archivo que desea copiar. Así que esto fusionará todos sus cambios, pero solo estamos usando esta rama para capturar el archivo.
- Repare cualquier conflicto, etc. investigue su archivo.
- pago de su rama de trabajo
- Compruebe el archivo comprometido de su combinación.
- Cometerlo
Intenté parchear y mi situación era demasiado fea para eso. Así que en pocas palabras se vería así:
Rama de trabajo: una rama experimental: B (contiene file.txt que tiene cambios que quiero plegar).
git checkout A
Crear nueva rama basada en A:
git checkout -b tempAB
Fusionar B en tempAB
git merge B
Copia el hash sha1 de la fusión:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <[email protected]>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch ''B'' into tempAB
Compruebe su rama de trabajo:
git checkout A
Revisa tu archivo arreglado:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Y ahí deberías tenerlo. Confíe su resultado.
Esto utiliza la herramienta interna de git. Tal vez un poco de trabajo por hacer, pero sencillo.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
Podrías usar:
git merge-file
Consejo: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
Suponiendo que B es la rama actual:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Tenga en cuenta que esto solo aplica cambios al archivo local. Tendrás que comprometerte después.
Mi edición se rechazó, así que adjunto cómo manejar los cambios de fusión desde una sucursal remota aquí.
Si tiene que hacer esto después de una combinación incorrecta, puede hacer algo como esto:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you''ll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You''ll probably have to
git push -f # make sure you know what you''re doing.
Me encontré con el mismo problema. Para ser precisos, tengo dos ramas A
y B
con los mismos archivos pero una interfaz de programación diferente en algunos archivos. Ahora, los métodos del archivo f
, que son independientes de las diferencias de interfaz en las dos ramas, se cambiaron en la rama B
, pero el cambio es importante para ambas ramas. Por lo tanto, necesito fusionar el archivo f
de la rama B
en el archivo f
de la rama A
Un simple comando ya resolvió el problema por mí si asumo que todos los cambios se cometen en las ramas A
y B
:
git checkout A
git checkout --patch B f
El primer comando cambia a la rama A
, donde quiero combinar la versión de B
del archivo f
. El segundo comando parchea el archivo f
con f
de HEAD
de B
Incluso puede aceptar / descartar partes individuales del parche. En lugar de B
, puede especificar cualquier compromiso aquí, no tiene que ser HEAD
.
Edición de comunidad : si el archivo f
en B
todavía no existe en A
, omita la opción --patch
. De lo contrario, obtendrá un "Sin cambio". mensaje.