2009-09-10 18 views
74

Tome este escenario:Usando GIT, ¿cómo puedo seleccionar/fusionar los cambios selectivamente desde el 'tenedor' de otro?

  1. decido 'tenedor' una base de código en github.com, y empezar a hacer mi rutina: Editar - Comprometerse - Empuje; 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 fusionarlas con las mías. 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'?

Respuesta

112

Después de arrastre de las olas del mundo IRC, alguien le dio una gran solución:

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

Esperemos que ayuda a cualquier otra persona con la misma pregunta!

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

  1. En primer lugar, tiene que estar en su repositorio, haga lo necesario cd -ing para llegar a su directorio de trabajo.

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

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

    git fetch someUser

  3. Ahora se puede ejecutar como git log someUser/master para encontrar el SHA1 cometer desea combinar en 'parcialmente'.

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

    git cherry-pick -n SHA1

    donde SHA1 es el SHA cometer, duh!

  5. Es muy posible que existan 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 tiene que restablecer el índice a la revisión HEAD, a continuación, a continuación, puede utilizar el comando de confianza GIT add --patch de escoger y elegir qué cambios desea:

    git reset HEAD

    git add --patch o git add -p

  7. ¡Yay! Dedicar tiempo:

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

  8. Para limpiar el desorden (Las cosas que no ha dicho en el git add --patch) y sólo mantener los cambios seleccionados en su repositorio de trabajo, ejecute:

    git reset --hard HEAD

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

+0

Me complace que haya encontrado 'git add -p'; es extremadamente poderoso. Si ya tiene el compromiso en cuestión (p. Ej., No usó '--no-commit' en el cherry-pick, o es uno de sus commits), puede usar' git reset HEAD^'para rebobinar el índice a commit Atrás, luego agregue los cambios nuevamente con 'git add -p', confirmando en pasos. Si la confirmación no está en la sugerencia de la sucursal, puede usar 'git rebase -i' y elegir editar la confirmación en cuestión. – Cascabel

+0

¡Muchas gracias por esto! –

+1

agradable recorrido. recuerde que si solo quiere la confirmación ** completa **, simplemente emita '-n' en el paso 4. De esta manera:' git cherry-pick SHA1' – Hulvej

1

Si solo desea un puerto de confirmación, probablemente sea mejor que elija cuidadosamente la confirmación que desea y restablezca los archivos que no desea que se toquen.

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

Por supuesto, si usted tiene varias piezas modificadas en un archivo y sólo desea mantener algunos de ellos que no tienen más remedio que editar el archivo manualmente, cortando sus cambios.

+2

¿Es necesario el pago aquí? ¿El comando cherry pick no pone los cambios en su directorio de trabajo? –

2

No tengo claro qué es lo que quieres. Si desea ingresar solo ciertas confirmaciones de las otras horquillas, puede usar git cherry-pick SHA. Explicación completa en gitready.

+0

Solo estoy después de una "porción"/"sección"/"algunas líneas" de una confirmación en particular, fusionada en mi repositorio. No particularmente específico del archivo. – Tim

+0

En ese caso, el parche de formato git SHA, git apply es una opción – hgmnz

2

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

he puesto vimdiff como mi difftool, y luego fusionar selectivamente I DIFF la rama:

git difftool <branch> <file> 

Luego voy al panel con la versión de la rama actual y editar el original, en vim (a veces esto no es 't necesario, pero a veces vimdiff abre una versión en/tmp) y desactivar modo de sólo lectura:

:e <file> 
:set readonly! 

Ahora puede utilizar las herramientas de parches de vim como do y dp de aplicar lo que quiero, y hacer otra pequeña edita mientras voy. 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 sigue siendo puramente en la línea de comandos. Solo asegúrese de agregar un mensaje claro de compromiso, ya que git no incluirá automáticamente un mensaje de fusión para usted.

vimdiff example http://j.mp/1dZVllt

+0

No creo que esta respuesta califique completamente como digna de ser una respuesta totalmente independiente. Información útil, pero no particularmente relevante. (¿por qué está esto en la parte superior de las respuestas?) –

Cuestiones relacionadas