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 puedo mover los cambios no comprometidos existentes a una nueva rama y restablecer la actual?

Quiero restablecer mi rama actual mientras conservo el trabajo existente en la nueva característica.

Author: Cœur, 2009-09-08

5 answers

Utilice lo siguiente:

git checkout -b <new-branch>

Esto dejará su rama actual como está, creará y comprará una nueva rama y mantendrá todos sus cambios. Luego puedes hacer un commit con:

git add <files>

Y confirmar a su nueva rama con:

git commit -m "<Brief description of this commit>"

Los cambios en el directorio de trabajo y los cambios en index no pertenecen a ninguna rama todavía. Esto cambia donde esos cambios terminarían.

No restableces tu rama original, se queda como está. El último commit en <old-branch> seguirá siendo el mismo. Por lo tanto usted checkout -b y luego comprometerse.

 3030
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-27 11:42:20

Alternativamente:

  1. Guardar los cambios actuales en un alijo temporal:

    $ git stash

  2. Crea una nueva rama basada en este alijo, y cambia a la nueva rama:

    $ git stash branch <new-branch> stash@{0}

Consejo: utilice la tecla tab para reducir la escritura del nombre del alijo.

 262
Author: Robin Qiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 22:50:34

Si has estado haciendo commits en tu rama principal mientras codificabas, pero ahora quieres mover esos commits a una rama diferente:

  1. Copie su historial actual en una nueva rama, trayendo también cualquier cambio no comprometido:

    git checkout -b <new-feature-branch>
    
  2. Ahora fuerza la rama original "desordenada" a retroceder: (sin cambiar a ella)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Por ejemplo:

    git branch -f master origin/master
    

    O si hubieras hecho 4 commits:

    git branch -f master HEAD~4
    

Advertencia: parece que git branch -f master origin/master se restablecer la información de seguimiento para esa rama. Por lo tanto, si ha configurado su rama master para enviar a otro lugar que no sea origin/master, entonces esa configuración se perderá.

Una alternativa es usar esta técnica de reinicio. Pero esas instrucciones descartarán cualquier cambio no comprometido que tenga. Si quieres guardarlos, aliéntalos primero y deshazte de ellos en el final.

 37
Author: joeytwiddle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 04:05:16

Si lo confirmas, también puedes seleccionar el ID de confirmación individual. Hago esto a menudo cuando empiezo a trabajar en master,y luego quiero crear una rama local antes de subir a mi origin/.

git cherry-pick <commitID>

Hay mucho que puede hacer con cherry-pick, como se describe aquí, pero esto podría ser un caso de uso para usted.

 16
Author: password,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-30 20:58:06

El escenario común es el siguiente: Olvidé crear la nueva rama para la nueva característica, y estaba haciendo todo el trabajo en la antigua rama de característica. He comprometido todo el trabajo " viejo "a la rama maestra, y quiero que mi nueva rama crezca desde el"maestro". No he hecho un solo compromiso de mi nuevo trabajo. Aquí está la estructura de la rama: "master" - >"Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
 1
Author: Alex Burov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-13 16:07:54