Pregunta Git: crea una rama desde cambios no configurados / no confirmados en el maestro


Contexto: estoy trabajando en el maestro agregando una característica simple. Después de unos minutos me di cuenta de que no era tan simple y que debería haber sido mejor trabajar en una nueva sucursal.

Esto siempre me pasa y no tengo idea de cómo cambiar a otra rama y llevar todos estos cambios sin compromiso conmigo dejando la rama principal limpia. Supuse git stash && git stash branch new_branch simplemente lo lograría, 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 manera de lograr esto?


789
2018-04-02 22:09


origen


Respuestas:


No es necesario esconder.

git checkout -b new_branch_name

no toca tus cambios locales. Simplemente crea la rama de la CABEZA actual y establece la CABEZA allí. Así que supongo que eso es lo que quieres.

--- Editar para explicar el resultado del checkout master ---

Estas 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:

M   testing

, 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 todavía muestra sus cambios locales, aunque usted está en master.

Si realmente desea descartar los cambios locales, debe forzar el pago con -f.

git checkout master -f

Como nunca se cometieron sus cambios, los perdería.

Intenta regresar a tu sucursal, confirma tus cambios y luego revisa el master nuevamente.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Deberías obtener un M mensaje después del primer pago, pero luego ya no checkout mastery git status no debe mostrar ningún archivo modificado

--- Editar para aclarar la confusión sobre el directorio de trabajo (archivos locales) ---

En respuesta a su primer comentario, los cambios locales son simplemente ... bueno, locales. Git no los guarda automáticamente, debes decirle que los guarde para más adelante. Si realiza cambios y no los compromete o oculta explícitamente, git no los versionará. Si cambias HEAD (checkout master), los cambios locales no se sobrescriben porque no se han guardado.


941
2018-04-02 22:25



Tratar:

git stash
git checkout -b new-branch
git stash apply

50
2018-04-02 22:15



Dos cosas que puedes hacer:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

o

git stash -u
git branch sillyname stash@{0}

(git checkout - <- el tablero es un atajo para la rama anterior en la que estabas)

(git stash -u <- el -u significa que también toma cambios no supervisados)


15
2018-01-13 21:38



Si está utilizando el cliente de GitHub Windows (como yo) y está en la situación de haber realizado cambios no confirmados que desea mover a una nueva sucursal, simplemente puede "Crate una nueva sucursal" a través del cliente de GitHub. Cambiará a la rama recién creada y conservará sus cambios.

enter image description here


4
2017-09-13 13:35