mover cambios confirmados (pero no empujados) a una nueva rama después de extraer

Resuelto Dave Sherohman asked hace 13 años • 12 respuestas

He trabajado bastante ("Su rama está por delante de 'origen/maestro' en 37 confirmaciones"), que realmente debería haber ido a su propia rama en lugar de a master. Estas confirmaciones solo existen en mi máquina local y no han sido enviadas a origin, pero la situación es algo complicada porque otros desarrolladores han estado presionando origin/mastery yo he realizado esos cambios.

¿Cómo muevo retroactivamente mis 37 confirmaciones locales a una nueva sucursal? Según los documentos, parece que git rebase --onto my-new-branch masterdebería ...origin/masterhacer esto, pero ambos me dan el error "fatal: se necesita una sola revisión". man git-rebaseno dice nada acerca de proporcionar una revisión rebasey sus ejemplos no lo hacen, por lo que no tengo idea de cómo resolver este error.

(Tenga en cuenta que esto no es un duplicado de Mover trabajo existente no comprometido a una nueva rama en Git o ¿Cómo fusionar mis cambios locales no confirmados en otra rama de Git? ya que esas preguntas tratan de cambios no confirmados en el árbol de trabajo local, no de cambios que tienen cometido localmente.)

Dave Sherohman avatar Feb 21 '11 19:02 Dave Sherohman
Aceptado

Esto debería estar bien, ya que aún no has enviado tus confirmaciones a ningún otro lugar y eres libre de reescribir el historial de tu rama después origin/master. Primero, ejecutaría un git fetch originpara asegurarme de que origin/masteresté actualizado. Suponiendo que actualmente estás en master, deberías poder hacer:

git rebase origin/master

... que reproducirá todas tus confirmaciones que no estén origin/masteren origin/master. La acción predeterminada de rebase es ignorar las confirmaciones de fusión (por ejemplo, aquellas que git pullprobablemente introdujeron sus correos electrónicos) y simplemente intentará aplicar el parche introducido por cada una de sus confirmaciones en origin/master. (Es posible que tengas que resolver algunos conflictos a lo largo del camino). Luego puedes crear tu nueva rama basada en el resultado:

git branch new-work

... y luego restablece tu masterespalda a origin/master:

# Use with care - make sure "git status" is clean and you're still on master:
git reset --hard origin/master

Al realizar este tipo de manipulación de ramas con git branch, git reset, etc., me resulta útil mirar con frecuencia el gráfico de confirmación con gitk --alluna herramienta similar o una herramienta similar, solo para comprobar que entiendo hacia dónde apuntan las diferentes referencias.

Alternativamente, podría haber creado una rama de tema basada en dónde se encuentra su maestro en primer lugar ( git branch new-work-including-merges) y luego restablecerla mastercomo se indicó anteriormente. Sin embargo, dado que la rama de su tema incluirá fusiones origin/mastery aún no ha realizado los cambios, sugeriría hacer una reorganización para que el historial esté más ordenado. (Además, cuando finalmente vuelvas a fusionar la rama temática con la principal, los cambios serán más obvios).

Mark Longair avatar Feb 21 '2011 12:02 Mark Longair

Me quedé con el mismo problema. He encontrado la solución más sencilla que me gusta compartir.

1) Crea una nueva rama con tus cambios.

git checkout -b mybranch

2) (Opcional) Inserte un nuevo código de sucursal en el servidor remoto.

git push origin mybranch

3) Vuelva a pagar a la sucursal principal.

git checkout master

4) Restablezca el código de la sucursal maestra con el servidor remoto y elimine la confirmación local.

git reset --hard origin/master
NiRmaL avatar Oct 13 '2017 09:10 NiRmaL

Si tiene un número bajo de confirmaciones y no le importa si se combinan en una mega confirmación, esto funciona bien y no da tanto miedo como hacer git rebase:

eliminar los archivos (reemplazar 1 con # de confirmaciones)

git reset --soft HEAD~1

crear una nueva sucursal

git checkout -b NewBranchName

agregar los cambios

git add -A

hacer un compromiso

git commit -m "Whatever"
Stachu avatar Apr 25 '2017 13:04 Stachu

Una forma más de asumir que rama1 es una rama con cambios confirmados, rama2 es una rama deseable

git fetch && git checkout branch1
git log

seleccione los ID de confirmación que necesita mover

git fetch && git checkout branch2
git cherry-pick commit_id_first..commit_id_last
git push

Ahora revierta las confirmaciones no enviadas de la rama inicial

git fetch && git checkout branch1
git reset --soft HEAD~1
Andriy avatar Jul 08 '2016 12:07 Andriy