mover cambios confirmados (pero no empujados) a una nueva rama después de extraer
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/master
y 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 master
debería ...origin/master
hacer esto, pero ambos me dan el error "fatal: se necesita una sola revisión". man git-rebase
no dice nada acerca de proporcionar una revisión rebase
y 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.)
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 origin
para asegurarme de que origin/master
esté 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/master
en origin/master
. La acción predeterminada de rebase es ignorar las confirmaciones de fusión (por ejemplo, aquellas que git pull
probablemente 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 master
espalda 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 --all
una 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 master
como se indicó anteriormente. Sin embargo, dado que la rama de su tema incluirá fusiones origin/master
y 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).
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
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"
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