He trabajado bastante ("Su rama está por delante de 'origin / master' en 37 commits"), que realmente debería haber entrado en su propia rama en lugar de en master
. Estas confirmaciones solo existen en mi máquina local y no han sido presionadas origin
, pero la situación es un tanto complicada porque otros desarrolladores han estado presionando origin/master
y he eliminado esos cambios.
¿Cómo muevo retroactivamente mis 37 commits locales a una nueva sucursal? Sobre la base de los documentos, parece ser que git rebase --onto my-new-branch master
o ...origin/master
debería hacerlo, pero ambos me acaba de dar el error "fatal: Se necesita una única revisión". man git-rebase
no dice nada acerca de proporcionar una revisión rebase
y sus ejemplos no lo hacen, así que no tengo idea de cómo resolver este error.
(Tenga en cuenta que esto no es un duplicado de Mover el trabajo no comprometido existente a una nueva sucursal en Git o ¿Cómo fusionar mis cambios locales no comprometidos en otra rama de Git? Ya que esas preguntas tratan con cambios no comprometidos en el árbol de trabajo local, no cambios que tienen sido comprometido localmente)
Respuestas:
Esto debería estar bien, ya que aún no ha empujado sus confirmaciones en ningún otro lugar, y puede volver a escribir el historial de su rama después
origin/master
. Primero ejecutaría ungit fetch origin
para asegurarme de queorigin/master
esté actualizado. Asumiendo que estás actualmentemaster
, deberías poder hacer:... que reproducir todos tus commits que no están en
origin/master
aorigin/master
. La acción predeterminada de rebase es ignorar las confirmaciones de fusión (por ejemplo, aquellas quegit pull
probablemente haya introducido) y solo intentará aplicar el parche introducido por cada una de sus confirmacionesorigin/master
. (Puede que tenga que resolver algunos conflictos en el camino). Luego, puede crear su nueva sucursal en función del resultado:... y luego restablece tu
master
espalda aorigin/master
:Al hacer este tipo de manipulación de ramas con
git branch
,git reset
etc., me resulta útil mirar con frecuencia el gráfico de compromiso congitk --all
o una herramienta similar, solo para comprobar que entiendo a dónde apuntan las diferentes referencias.Alternativamente, podría haber creado una rama de tema en función de dónde se encuentra su maestro en primer lugar (
git branch new-work-including-merges
) y luego restablecermaster
como se indicó anteriormente. Sin embargo, dado que la rama de su tema incluirá fusionesorigin/master
y aún no ha presionado sus cambios, le sugiero que haga una nueva modificación para que el historial sea más ordenado. (Además, cuando finalmente fusiones la rama de tu tema de nuevo a master, los cambios serán más obvios).fuente
master
; el rebase vuelve a escribir lamaster
rama para que los nuevos commits estén linealmente encimaorigin/master
, luegogit branch new-work
crea unanew-work
rama apuntando a la punta demaster
(la rama actual) sin cambiar la rama actual anew-work
. Así que ahoranew-work
contiene todos los nuevos commits. Luego, el restablecimiento mueve la rama actual (aúnmaster
) de nuevo aorigin/master
.git reset
otras formas. Elgit branch new-work
es sólo decir "crear un señalador rama en este cometen mientras me quedo en mi rama actual (que es el amo en este caso)". Por lo tanto, no es necesario tener un comando que mueva las confirmaciones del maestro a la nueva rama: simplemente crea una nueva rama allí y cuando reinicia el maestro, la nueva rama queda donde estaba el maestroSi tiene un número bajo de commits y no le importa si se combinan en un mega-commit, esto funciona bien y no es tan aterrador como hacerlo
git rebase
:desestabilizar los archivos (reemplazar 1 con # de confirmaciones)
crear una nueva sucursal
agregar los cambios
hacer un compromiso
fuente
git log --all --decorate --oneline --graph
.Me quedé con el mismo problema. He encontrado la solución más fácil que me gusta compartir.
1) Crea una nueva rama con tus cambios.
2) (Opcional) Inserte un nuevo código de sucursal en el servidor remoto.
3) Pago de vuelta a la sucursal maestra.
4) Restablezca el código de sucursal maestro con el servidor remoto y elimine la confirmación local.
fuente
Una forma más de asumir que branch1 - es branch con cambios comprometidos branch2 - es branch deseado
seleccione los ID de confirmación que necesita mover
Ahora revierta las confirmaciones no apresuradas de la rama inicial
fuente
Alternativamente, justo después de comprometerse con la rama incorrecta, realice estos pasos:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Me imagino que hay un enfoque más simple para los pasos uno y dos.
fuente
Qué pasa:
git reset
volver a la última confirmación antes de comenzar a hacer cambios.git pull
para volver a tirar solo los cambios remotos que arrojó con el reinicio.¿O eso explotará cuando intentes volver a fusionar la rama?
fuente
Aquí hay una manera mucho más simple:
Crea una nueva sucursal
En su nueva sucursal, haga una
git merge master
: esto fusionará sus cambios comprometidos (no empujados) a su nueva sucursalElimine su rama maestra local
git branch -D master
Use en-D
lugar de-d
porque desea forzar la eliminación de la rama.Simplemente haga una
git fetch
en su rama maestra y haga unagit pull
en su rama maestra para asegurarse de tener el último código de su equipo.fuente
Un enfoque más simple, que he estado usando (suponiendo que quiera mover 4 commits):
(Busque en el directorio desde el que ejecutó el último comando para los 4
.patch
archivos)Entonces:
En el orden que quisieras.
fuente
Pagar copia fresca de sus fuentes
git clone ........
Hacer rama desde la posición deseada
git checkout {position}
git checkout -b {branch-name}
Agregar repositorio remoto
git remote add shared ../{original sources location}.git
Obtenga fuentes remotas
git fetch shared
Checkout rama deseada
git checkout {branch-name}
Combinar fuentes
git merge shared/{original branch from shared repository}
fuente
Para mí esta fue la mejor manera:
git fetch
git branch my-changes
y empuje a remotogit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
fuente