Mover el trabajo existente no comprometido a una nueva rama en Git
Comencé a trabajar en una nueva característica y después de codificar un poco, decidí que esta característica debería estar en su propia rama.
¿Cómo muevo los cambios existentes no confirmados a una nueva rama y restablezco la actual?
Quiero restablecer mi rama actual y al mismo tiempo conservar el trabajo existente en la nueva función.
Actualización 2020 / Git 2.23
Git 2.23 agrega el nuevo switch
subcomando en un intento de aclarar parte de la confusión que surge del uso sobrecargado de checkout
(cambiar de rama, restaurar archivos, desconectar HEAD, etc.)
A partir de esta versión de Git, reemplace el comando de pago con:
git switch -c <new-branch>
El comportamiento es idéntico y permanece sin cambios.
Antes de la actualización 2020/Git 2.23
Utilice lo siguiente:
git checkout -b <new-branch>
Esto dejará su sucursal actual como está, creará y pagará una nueva sucursal y conservará todos los cambios. Luego puede realizar cambios en los archivos para confirmar:
git add <files>
y comprométete con tu nueva sucursal con:
git commit -m "<Brief description of this commit>"
Los cambios en el directorio de trabajo y los cambios realizados en el índice aún no pertenecen a ninguna rama . Esto cambia la rama donde terminarían esas modificaciones.
No restableces tu rama original, permanece como está. El último compromiso <old-branch>
seguirá siendo el mismo. Por lo tanto, usted checkout -b
y luego se compromete.
Alternativamente:
Guarde los cambios actuales en un alijo temporal:
$ git stash
Cree una nueva rama basada en este alijo y cambie a la nueva rama:
$ git stash branch <new-branch> stash@{0}
Consejo: use la tecla de tabulación para reducir la escritura del nombre del alijo.
Si ha estado realizando confirmaciones en su rama principal mientras codificaba, pero ahora desea mover esas confirmaciones a una rama diferente, esta es una forma rápida:
Copie su historial actual en una nueva rama, incorporando también los cambios no confirmados:
git checkout -b <new-feature-branch>
Ahora fuerce la reversión de la rama "desordenada" original: (sin cambiar a ella)
git branch -f <previous-branch> <earlier-commit-id>
Por ejemplo:
git branch -f master origin/master
o si hubieras realizado 4 confirmaciones:
git branch -f master HEAD~4
Advertencia: git branch -f master origin/master
restablecerá la información de seguimiento de esa sucursal. Entonces, si ha configurado sumaster
sucursal para enviar a otro lugar que no seaorigin/master
esa configuración, se perderá.
Advertencia: si cambia la base después de la bifurcación, existe el peligro de que se pierdan algunas confirmaciones, como se describe aquí . La única forma de evitarlo es crear un nuevo historial mediante selección selectiva. Ese enlace describe el método más seguro e infalible, aunque menos conveniente. (Si tiene cambios no confirmados, es posible que necesite hacerlogit stash
al principio ygit stash pop
al final).