Toma este escenario:
- Decido 'bifurcar' una base de código en github.com, y empiezo a hacer mi rutina: Editar - Confirmar - Empujar; también conocido como hack hack hack.
- Después de hacer algunos cambios, veo algunos cambios que otra persona ha hecho en el mismo proyecto, ¡y me gustan!
- Decido que quiero fusionarlos con los míos. El problema es que solo quiero una 'porción' 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 'bifurcación'?
Respuestas:
Después de trollear las olas del mundo IRC, alguien dio una gran solución:
¡Ojalá ayude a cualquiera con la misma pregunta!
EDITAR: OK, tal vez no sea tan simple. Estos son los pasos completos:
Primero tienes que estar en tu repositorio, hacer los
cd
-ing necesarios para llegar a tu directorio de trabajo.Ahora debe agregar la rama remota y luego buscarla. Haz esto por:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
Ahora puede ejecutar comandos como
git log someUser/master
para encontrar la confirmación SHA1 que desea fusionar 'parcialmente'.Una vez que tenga el SHA, ahora puede ejecutar:
git cherry-pick -n SHA1
¿Dónde
SHA1
está el compromiso SHA, duh!Es muy posible que haya conflictos, según la antigüedad del compromiso y la frecuencia con la que cambia esa área particular del proyecto. Lo sentimos, pero debe resolverlos manualmente con su editor de confianza. Así que saque VIM, o cualquier otra cosa que use, y elimine los conflictos hasta que llegue a la etapa en la que le gustan los cambios.
Ahora debe restablecer el índice a la revisión HEAD, luego puede usar el confiable
add --patch
comando GIT para elegir qué cambios desea:git reset HEAD
git add --patch
ogit add -p
¡Hurra! Comprometer tiempo:
git commit -m "I merged a select amount of changes"
Para limpiar el desorden (las cosas a las que dijo que no
git add --patch
) y solo mantener los cambios seleccionados en su repositorio de trabajo, ejecute:git reset --hard HEAD
Aparentemente también
git checkout -f
es otra opción.fuente
git add -p
; es extremadamente poderoso. Si ya tiene la confirmación en cuestión (por ejemplo, no la usó--no-commit
en la selección de cereza, o es una de sus confirmaciones), puede usarlagit reset HEAD^
para rebobinar el índice y luego volver a agregar los cambios congit add -p
, confirmando en pasos . Si la confirmación no está en la punta de la rama, puede usargit rebase -i
y elegir editar la confirmación en cuestión.-n
en el paso 4. Así:git cherry-pick SHA1
git remote add <user> <fork-url>
: entonces puedegit cherry-pick
hacerlo como de costumbre.No tengo claro lo que quieres. Si desea traer solo ciertas confirmaciones de las otras bifurcaciones, puede usar
git cherry-pick SHA
. Explicación completa sobre gitready .fuente
Realmente me gusta la solución de Tim, sin embargo, a veces me gusta jugar en vimdiff. Mi solución a este problema es cruda, pero me funciona porque me gusta vim.
He configurado vimdiff como mi difftool, y luego, para fusionar selectivamente, difiero la rama:
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 deshabilito el modo de solo lectura:
Ahora puedo usar las herramientas de parche de vim, como
do
ydp
para aplicar lo que quiero, y hacer otras pequeñas ediciones sobre la marcha. Cuando termino, guardo el archivo, salgo de vim y luego presento y confirmo el archivo en git como una edición normal.Como dije, esto no es particularmente sofisticado, pero es muy poderoso y aún está puramente en la línea de comandos. Solo asegúrese de agregar un mensaje de confirmación claro, ya que git no incluirá automáticamente un mensaje de combinación para usted.
Ejemplo de vimdiff http://j.mp/1dZVllt
fuente
Si solo desea un puerto de una confirmación, probablemente sea mejor seleccionar la confirmación que desea y restablecer los archivos que no desea que se toquen.
Por supuesto, si tiene varias partes modificadas en un archivo y solo desea conservar algunas de ellas, no tiene más remedio que editar el archivo manualmente, eliminando los cambios.
fuente