Mover el trabajo existente no comprometido a una nueva rama en Git

Resuelto Dane O'Connor asked hace 15 años • 13 respuestas

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.

Dane O'Connor avatar Sep 08 '09 22:09 Dane O'Connor
Aceptado

Actualización 2020 / Git 2.23

Git 2.23 agrega el nuevo switchsubcomando 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 -by luego se compromete.

knittl avatar Sep 08 '2009 15:09 knittl

Alternativamente:

  1. Guarde los cambios actuales en un alijo temporal:

    $ git stash

  2. 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.

Robin Qiu avatar Jun 19 '2015 00:06 Robin Qiu

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:

  1. Copie su historial actual en una nueva rama, incorporando también los cambios no confirmados:

     git checkout -b <new-feature-branch>
    
  2. 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 sumastersucursal para enviar a otro lugar que no seaorigin/masteresa 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 stashal principio ygit stash popal final).

joeytwiddle avatar Feb 12 '2016 07:02 joeytwiddle