Contexto: estoy trabajando en master agregando una característica simple. Después de unos minutos, me doy cuenta de que no era tan simple y que debería haber sido mejor trabajar en una nueva sucursal.
Esto siempre me sucede y no tengo idea de cómo cambiar a otra rama y llevar todos estos cambios no confirmados conmigo dejando la rama maestra limpia. Supuse git stash && git stash branch new_branch
que simplemente lograría eso, pero esto es lo que obtengo:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
¿Sabes si hay alguna forma de lograr esto?
Respuestas:
No hay necesidad de esconderse.
no toca tus cambios locales. Simplemente crea la rama desde el HEAD actual y establece el HEAD allí. Así que supongo que eso es lo que quieres.
--- Editar para explicar el resultado del proceso de pago maestro ---
¿Estás confundido porque
checkout master
no descarta tus cambios?Como los cambios son solo locales, git no quiere que los pierdas demasiado fácilmente. Al cambiar de rama, git no sobrescribe sus cambios locales. El resultado de tu
checkout master
es:, lo que significa que sus archivos de trabajo no están limpios. git cambió el HEAD, pero no sobrescribió sus archivos locales. Es por eso que su último estado aún muestra sus cambios locales, aunque está en
master
.Si realmente desea descartar los cambios locales, debe forzar el pago con
-f
.Como sus cambios nunca se cometieron, los perdería.
Intente volver a su sucursal, confirme los cambios y luego vuelva a pagar el master.
Debería recibir un
M
mensaje después del primer pago, pero luego no más después delcheckout master
, y nogit status
debería mostrar archivos modificados.--- Editar para aclarar la confusión sobre el directorio de trabajo (archivos locales) ---
En respuesta a su primer comentario, los cambios locales son solo ... bueno, locales. Git no los guarda automáticamente, debe indicarle que los guarde para más adelante. Si realiza cambios y no los confirma ni los oculta explícitamente, git no los versionará. Si cambia HEAD (
checkout master
), los cambios locales no se sobrescriben desde que no se guardaron.fuente
git checkout
"Actualiza los archivos en el árbol de trabajo para que coincidan con la versión en el índice o el árbol especificado". Eso supone que sus cambios en su sistema de archivos se IDARÁN después. Sin ninguna posibilidad de recuperarlos. Incluso si dices que no lo harán, esto todavía deja un mal presentimiento. No confío en esto en absoluto . O la documentación es realmente mala o el comportamiento predeterminado de git es realmente peligroso. Uno no debería tener que confiar en alguna heurística "automática" para detectar que en este caso no desea perder sus cambios.checkout
no entra en conflicto con sus cambios locales, el pago funciona y deja los cambios locales solos. Sin embargo, entiendo el mal presentimiento, la página del manual tal vez debería decir "Actualiza archivos no modificados en el árbol de trabajo". Git, por otro lado, no hace que sea demasiado fácil perder los cambios locales.git checkout
o deja solo los cambios locales o se niega si hay un conflicto.git checkout <other_branch> -f
. Perderá sus cambios locales sin previo aviso.Tratar:
fuente
Dos cosas que puedes hacer:
o
(
git checkout -
<- el guión es un acceso directo para la rama anterior en la que estaba)(
git stash -u
<--u
significa que también se necesitan cambios no organizados)fuente
Si está utilizando el cliente de Windows GitHub (como yo) y se encuentra en la situación de haber realizado cambios no comprometidos que desea mover a una nueva sucursal, simplemente puede "crear una nueva sucursal" a través del cliente GitHub. Cambiará a la rama recién creada y preservará sus cambios.
fuente
Si desea que sus cambios actuales no confirmados en la rama actual se muevan a una nueva rama, use el siguiente comando para crear una nueva rama y copiar los cambios no confirmados automáticamente.
Esto creará una nueva rama de su rama actual (suponiendo que sea maestra), copie los cambios no confirmados y cambie a la nueva rama.
Confirma tus cambios en la nueva sucursal.
Como se crea una nueva rama, antes de llevarla a control remoto, debe configurarla en sentido ascendente. Use el siguiente comando para configurar el flujo ascendente y empujarlo a remoto.
Una vez que presione este comando, se creará una nueva rama en el control remoto y su nueva rama local se enviará a control remoto.
Ahora, si desea descartar sus cambios no confirmados de la rama maestra, use:
Esto eliminará cualquier cambio local no confirmado al finalizar la compra.
fuente
En el último cliente de GitHub para Windows , si tiene cambios no confirmados y elige crear una nueva sucursal.
Le indica cómo manejar este escenario exacto:
Lo mismo se aplica si simplemente cambia la rama también.
fuente