git - crear - moviendo cambios comprometidos(pero no empujados) a una nueva rama después de tirar
git push (9)
Checkout nueva copia de sus fuentes
git clone ........
Hacer rama desde la posición deseada
git checkout {position}
git checkout -b {branch-name}
Añadir repositorio remoto
git remote add shared ../{original sources location}.git
Obtener fuentes remotas
git fetch shared
Checkout rama deseada
git checkout {branch-name}
Fusionar fuentes
git merge shared/{original branch from shared repository}
He hecho un poco de trabajo ("Tu sucursal está por delante de ''origen / maestro'' con 37 confirmaciones ''") que realmente debería haber ingresado en su propia sucursal en lugar de en el master
. Estas confirmaciones solo existen en mi máquina local y no han sido empujadas a origin
, pero la situación es algo complicada ya que otros desarrolladores han estado presionando a origin/master
y he eliminado 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
o ...origin/master
debería hacer esto, pero ambos solo me dan el error "fatal: se necesita una sola revisión". man git-rebase
no dice nada sobre proporcionar una revisión de 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 no comprometido existente a una nueva sucursal en Git o ¿Cómo combinar mis cambios locales no confirmados a otra sucursal de Git? Ya que esas preguntas se refieren a cambios no confirmados en el árbol de trabajo local, no a cambios que hayan sido cometido localmente)
Alternativamente, justo después de que te comprometas con la rama incorrecta, sigue 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
Puedo imaginar que hay un enfoque más simple para los pasos uno y dos.
Esto debería estar bien, ya que aún no has introducido tus confirmaciones en ningún otro lugar, y eres libre de volver a escribir el historial de tu sucursal después del 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 sus confirmaciones que no están en origin/master
en origin/master
. La acción predeterminada de rebase es ignorar las combinaciones de combinaciones (por ejemplo, aquellas que probablemente haya introducido su git pull
) y solo intentará aplicar el parche introducido por cada una de sus confirmaciones en origin/master
. (Es posible que tenga que resolver algunos conflictos en el camino). Luego, puede crear su nueva rama en función del resultado:
git branch new-work
... y luego restablecer su master
nuevo a origin/master
:
# Use with care - make sure "git status" is clean and you''re still on master:
git reset --hard origin/master
Al hacer este tipo de manipular ramas con git branch
, git reset
, etc., me parece útil mirar con frecuencia el gráfico de compromiso con gitk --all
o una herramienta similar, solo para comprobar que entiendo a dónde apuntan todos los diferentes refs .
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 reiniciar el master
como se master
anteriormente. Sin embargo, dado que su rama temática incluirá fusiones desde el origin/master
y aún no ha impulsado sus cambios, sugeriría hacer una rebase para que el historial sea más ordenado. (Además, cuando finalmente fusiones tu rama de tema con la maestra, los cambios serán más obvios).
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.
git checkout -b mybranch
2) Presione el nuevo código de sucursal en el servidor remoto.
git push origin mybranch
3) Salida de nuevo a la rama principal.
git checkout master
4) Restaure el código de la rama maestra con el servidor remoto y elimine la confirmación local.
git reset --hard origin/master
Para mi esta fue la mejor manera:
- Compruebe si hay cambios y fusionar conflictos
git fetch
- Crear una nueva rama
git branch my-changes
y empujar a remoto - Cambie en sentido ascendente a la nueva rama creada
git master -u upstream-branch remotes/origin/my-changes
- Empuje sus compromisos a la nueva rama aguas arriba.
- Vuelva al
git branch master --set-upstream-to remotes/origin/master
anterior anterior degit branch master --set-upstream-to remotes/origin/master
Qué pasa:
- Rama de la CABEZA actual.
- Asegúrese de que está en el maestro , no su nueva rama.
-
git reset
vuelve a la última confirmación antes de comenzar a hacer cambios. -
git pull
para volver a tirar solo los cambios remotos que tiró con el reinicio.
¿O explotará cuando intentes volver a combinar la rama?
Si tienes un número bajo de confirmaciones y no te importa si se combinan en un mega-confirmación, esto funciona bien y no da tanto miedo como hacer git rebase
:
desestabilice los archivos (reemplace 1 con # de confirmaciones)
git reset --soft HEAD~1
crear una nueva rama
git checkout -b NewBranchName
añadir los cambios
git add -A
hacer un compromiso
git commit -m "Whatever"
Un enfoque más simple, que he estado usando (asumiendo que desea mover 4 confirmaciones):
git format-patch HEAD~4
(Busque en el directorio desde el que ejecutó el último comando para los 4 archivos .patch
)
git reset HEAD~4 --hard
git checkout -b tmp/my-new-branch
Entonces:
git apply /path/to/patch.patch
En el orden que quisieras.
Una forma más de suponer que branch1 - es una rama con cambios confirmados branch2 - 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 revertir confirmaciones no presionadas de la rama inicial
git fetch && git checkout branch1
git reset --soft HEAD~1