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/mastery 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 mastero ...origin/masterdebería hacerlo, pero ambos me acaba de dar el error "fatal: Se necesita una única revisión". man git-rebaseno dice nada acerca de proporcionar una revisión rebasey 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 originpara asegurarme de queorigin/masteresté actualizado. Asumiendo que estás actualmentemaster, deberías poder hacer:... que reproducir todos tus commits que no están en
origin/masteraorigin/master. La acción predeterminada de rebase es ignorar las confirmaciones de fusión (por ejemplo, aquellas quegit pullprobablemente 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
masterespalda aorigin/master:Al hacer este tipo de manipulación de ramas con
git branch,git resetetc., me resulta útil mirar con frecuencia el gráfico de compromiso congitk --allo 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 restablecermastercomo se indicó anteriormente. Sin embargo, dado que la rama de su tema incluirá fusionesorigin/mastery 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 lamasterrama para que los nuevos commits estén linealmente encimaorigin/master, luegogit branch new-workcrea unanew-workrama apuntando a la punta demaster(la rama actual) sin cambiar la rama actual anew-work. Así que ahoranew-workcontiene todos los nuevos commits. Luego, el restablecimiento mueve la rama actual (aúnmaster) de nuevo aorigin/master.git resetotras formas. Elgit branch new-workes 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 loggit diff {previous to last commit} {latest commit} > your_changes.patchgit reset --hard origin/{your current branch}git checkout -b {new branch}git apply your_changes.patchMe imagino que hay un enfoque más simple para los pasos uno y dos.
fuente
Qué pasa:
git resetvolver a la última confirmación antes de comenzar a hacer cambios.git pullpara 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 masterUse en-Dlugar de-dporque desea forzar la eliminación de la rama.Simplemente haga una
git fetchen su rama maestra y haga unagit pullen 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
.patcharchivos)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}.gitObtenga fuentes remotas
git fetch sharedCheckout 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 fetchgit branch my-changesy empuje a remotogit master -u upstream-branch remotes/origin/my-changesgit branch master --set-upstream-to remotes/origin/masterfuente