Pregunta Usando GIT, ¿cómo puedo seleccionar / fusionar cambios selectivamente desde el "tenedor" de otro?


Toma este escenario:

  1. Decido "bifurcar" una base de código en github.com, y empiezo a hacer mi rutina: Editar - Comprometer - Empujar; alias hack hackear hack.
  2. Después de hacer algunos cambios, veo algunos cambios que otra persona ha realizado en el mismo proyecto, ¡y me gustan!
  3. Decido que quiero fusionarlos con los míos. El problema es que solo quiero una "parte" de una confirmación en particular, de varias confirmaciones que ha realizado.

¿Cuál sería el método más eficiente para obtener esta cantidad selecta de cambios, fusionados en mi 'tenedor'?


76
2017-09-10 12:36


origen


Respuestas:


Después de curiosear en las olas del mundo de IRC, alguien brindó una gran solución:

git cherry-pick SHA1 --no-commit
git add --patch

¡Espero que eso ayude a cualquier persona con la misma pregunta!

EDITAR: OK, tal vez no es así de simple. Estos son los pasos completos:

  1. Primero debe estar en su repositorio, hacer lo necesario cd-ing para llegar a su directorio de trabajo.

  2. Ahora necesita agregar la rama remota, y luego buscarla. Haz esto por:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. Ahora puede ejecutar comandos como git log someUser/master para encontrar la confirmación SHA1 que desea fusionar en "parcialmente".

  4. Una vez que tenga el SHA, ahora puede ejecutar:

    git cherry-pick -n SHA1

    dónde SHA1 es el compromiso SHA, duh!

  5. Es muy probable que haya conflictos, dependiendo de la antigüedad del compromiso y de la frecuencia con la que cambia esa área particular del proyecto. Lo siento, pero tienes que resolverlos manualmente con tu fiel editor. Así que saca VIM, o lo que sea que uses, y piratea los conflictos hasta que llegues al escenario donde te gusten los cambios.

  6. Ahora debe restablecer el índice a la revisión HEAD, luego puede usar el fiel GIT add --patch comando para escoger y elegir qué cambios quieres:

    git reset HEAD

    git add --patch o git add -p

  7. ¡Hurra! Tiempo de compromiso:

    git commit -m "I merged a select amount of changes"

  8. Para limpiar el desorden (Lo que dijiste no a en git add --patch) y solo conserva los cambios seleccionados en tu repositorio en funcionamiento, ejecuta:

    git reset --hard HEAD

    Aparentemente git checkout -f es otra opción también.


113
2017-09-10 13:05



No tengo claro lo que quieres. Si desea ingresar solo ciertos commits de las otras horquillas, puede usar git cherry-pick SHA. Explicación completa sobre gitready.


2
2017-09-10 12:40



Realmente me gusta la solución de Tim, sin embargo, a veces me gusta jugar en vimdiff. Mi solución a este problema es tosca, pero funciona para mí porque me gusta vim.

Tengo vimdiff establecido como mi difftool, y luego para combinar selectivamente difiero la rama:

git difftool <branch> <file>

Luego voy al panel con la versión de la rama actual y edito el original en vim (a veces esto no es necesario, pero a veces vimdiff abre una versión en / tmp) y desactivo el modo de solo lectura:

:e <file>
:set readonly!

Ahora puedo usar las herramientas de parche de vim como do y dp para aplicar lo que quiero, y hacer otras ediciones pequeñas a medida que avanzo. Cuando termine, guardo el archivo, salgo de vim, y luego preparo y envío el archivo en git como una edición regular.

Como dije, esto no es particularmente sofisticado, pero es muy poderoso, y aún puramente en la línea de comando. Solo asegúrese de agregar un mensaje claro de compromiso, ya que git no incluirá automáticamente un mensaje de fusión para usted.

Ejemplo de vimdiff http://j.mp/1dZVllt


2
2018-01-18 05:03



Si solo quieres un puerto de confirmación, probablemente lo mejor sea seleccionar cuidadosamente la confirmación que deseas y restablecer los archivos que no deseas que se toquen.

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

Por supuesto, si tiene varias partes modificadas en un archivo y solo desea conservar algunas, no tiene más remedio que editar el archivo manualmente, eliminando sus cambios.


1
2017-09-10 12:38