Mueva el trabajo no comprometido existente a una nueva sucursal en Git

3127

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 no confirmados existentes a una nueva sucursal y restablezco la actual?

Quiero restablecer mi rama actual mientras preserva el trabajo existente en la nueva función.

Dane O'Connor
fuente
¿El mismo tema interesante stackoverflow.com/q/556923/269514 ?
Gilberto

Respuestas:

3643

Use lo siguiente:

git checkout -b <new-branch>

Esto dejará su rama actual tal como está, creará y pagará una nueva rama y conservará todos sus cambios. Luego puede organizar los 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 en el índice todavía no pertenecen a ninguna rama . Esto cambia la rama donde terminarían esas modificaciones.

No restablece su rama original, se queda como está. La última confirmación <old-branch>seguirá siendo la misma. Por lo tanto usted checkout -by luego se comprometen.


Actualización 2020 / Git 2.23

Git 2.23 agrega el nuevo switchsubcomando en un intento de despejar algo de la confusión que proviene del uso sobrecargado de checkout(cambiar ramas, restaurar archivos, desconectar HEAD, etc.)

Comenzando con esta versión de Git, reemplace el comando anterior con:

git switch -c <new-branch>

El comportamiento es idéntico y permanece sin cambios.

knittl
fuente
15
Solo para asegurarme, ¿debo confirmar la función sin terminar ANTES de restablecer mi rama original? ¿O se conservarán esos archivos no confirmados independientemente de la confirmación?
Dane O'Connor
192
FYI: los cambios en el directorio de trabajo y los cambios en el índice no pertenecen a una rama. git checkout -b <new branch>cambios donde esos cambios terminarían.
Jakub Narębski
152
Si ya tiene una sucursal y desea mover sus cambios a la sucursal existente,
consulte
14
Si desea llevar su nueva sucursal al repositorio remoto: stackoverflow.com/questions/2765421/…
Dewayne
10
@JDSmith: los cambios no confirmados NO pertenecen a ninguna rama. Sólo se encuentran en el directorio de trabajo git checkout ./ git reset --hardserá irrecuperable eliminar ellas
knittl
331

Alternativamente:

  1. Guardar los cambios actuales en una reserva 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
fuente
51
Si la otra rama ya existe, puede cambiar a ella con el pago y envío git stash apply.
Archonic
66
No entiendo la sugerencia "Sugerencia: use la tecla de tabulación para reducir la escritura del nombre del alijo". ¿No es "alijo @ {0}" el nombre? No puedo ejecutarlo con éxito.
Herbert
77
¿Por qué es esto mejor que la respuesta aceptada stackoverflow.com/a/1394804/754997 ?
Chris Page
10
No entiendo por qué esto es mejor que la respuesta aceptada degit checkout -b <new branch name>
Noitidart
66
No es necesario git add -Aantes de esconderse.
vichle
48

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 sucursal, trayendo también los cambios no confirmados:

    git checkout -b <new-feature-branch>
    
  2. Ahora fuerce la rama original "desordenada" para que retroceda: (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 confirmaciones:

    git branch -f master HEAD~4
    

Advertencia: git branch -f master origin/master se restablezca el seguimiento de la información obtenida de dicha rama. Por lo tanto, si ha configurado sumasterrama para empujar a otro lugar que no seaorigin/masteresa configuración se perderá.

Advertencia: también existe el peligro de cambiar la base después de la ramificación, que se describe aquí . La única forma de evitar eso es crear una nueva historia usando cherry-pick. Ese enlace describe el método más seguro a toda prueba . Si tiene cambios no confirmados, es posible que desee algit stashprincipio ygit stash popal final.

joeytwiddle
fuente
66
Esto responde a una pregunta que es ligeramente diferente de lo que preguntó el operador. Decidí poner esta respuesta aquí porque aquí es donde Google me trajo cuando estaba buscando una respuesta. La pregunta real que se ocupa de esta situación está aquí .
joeytwiddle
26

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 rama de la característica anterior. He comprometido todo el trabajo "antiguo" a la rama maestra, y quiero que mi nueva rama crezca a partir de la "maestra". 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
Alex Burov
fuente
18

Si lo confirma, también podría seleccionar el ID de confirmación individual. Hago esto a menudo cuando comienzo a trabajar en master, y luego quiero crear una sucursal local antes de subir a mi origen /.

git cherry-pick <commitID>

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

contraseña
fuente
2
Una solución más agradable para mover cambios parciales a una nueva rama ... ya que puede confirmar lo que quiere por ahora, esconder todos los demás cambios, verificar la rama desde la que desea ramificar, seleccionar la confirmación en la nueva rama, volver a la rama original, restablece de nuevo un commit, luego haz un stash pop, agrega, commit y canta hallelujah.
Meredith el
1
@Meredith, jaja, ya algo así. Esto es genial, a menos que planee sus cambios con anticipación ... y quién hace eso;)
contraseña
1

En realidad, hay una manera realmente fácil de hacer esto con GitHub Desktop ahora que no creo que haya sido una característica antes.

Todo lo que necesita hacer es cambiar a la nueva rama en GitHub Desktop, y le pedirá que deje sus cambios en la rama actual (que se guardará), o que traiga sus cambios a la nueva rama. Simplemente elija la segunda opción, para llevar los cambios a la nueva sucursal. Luego puede comprometerse como de costumbre.

Escritorio GitHub

Kristofer Doman
fuente
1

Esto puede ser útil para todos los que usan herramientas para GIT

Mando

Cambiar rama: moverá sus cambios a nueva rama. Entonces puedes cometer cambios.

 $ git checkout -b <new-branch>

TortoiseGIT

Haga clic derecho en su repositorio y luego use TortoiseGit-> Switch / Checkout

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

SourceTree

Use el botón "Pagar" para cambiar de rama. Verá el botón "pagar" en la parte superior después de hacer clic en una rama. Los cambios desde la rama actual se aplicarán automáticamente. Entonces puedes cometerlos.

ingrese la descripción de la imagen aquí

Przemek Struciński
fuente
0

Solía @Robin respuesta y una lista de todo lo que hice,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Si el repositorio tiene más de un alijo, vea cuál aplicar a la nueva rama:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

e inspeccionar el alijo individual por,

git stash show stash@{1}

O inspeccione todos los escondites a la vez:

git stash list -p
NBhat
fuente