2010-10-10 19 views
531

Empecé a trabajar en mi rama principal pensando que mi tarea sería fácil. Después de un tiempo me di cuenta de que tomaría más trabajo y quiero hacer todo este trabajo en una nueva sucursal. ¿Cómo puedo crear una nueva sucursal y llevar todos estos cambios conmigo sin ensuciar al maestro?Crear una rama de Git con los cambios actuales

+8

posible duplicado de [Mueva el trabajo existente, sin compromiso a una nueva rama en Git] (http://stackoverflow.com/questions/1394797/move-existing-uncommited-work-to-a-new-branch-in -git) – Marijn

+0

dup de http://stackoverflow.com/questions/2569459/git-create-a-branch-from-unstaged-uncommited-changes-on-master – andrej

+1

gracias! ¡yo también! – Jonah

Respuesta

448

Si aún no ha realizado ninguna confirmación, bastará con (1: bifurcación) y (3: pago).
O, en un comando: git checkout -b newBranch

Como se mencionó en la git reset man page:

$ git branch topic/wip  # (1) 
$ git reset --hard HEAD~3 # (2) NOTE: use $git reset --soft HEAD~3 (explanation bellow) 
$ git checkout topic/wip # (3) 
  1. Usted ha hecho algunas confirmaciones, pero se dan cuenta que fueron prematuros a estar en el "master" rama. Desea continuar puliéndolos en una rama de tema, por lo que cree "topic/wip" rama fuera de la actual HEAD.
  2. Rebobine la rama master para deshacerse de esas tres confirmaciones.
  3. Cambie a la rama "topic/wip" y siga trabajando.

Nota: debido al efecto "destructiva" de un comando git reset --hard (. Lo hace restablece el índice y el árbol de trabajo Cualquier cambio en los archivos rastreados en el árbol de trabajo desde <commit> se descartan), prefiero vaya con a:

$ git reset --soft HEAD~3 # (2) 

, para asegurarse de que no estoy perdiendo ningún archivo privado (no agregado al índice).
La opción --soft no tocará en absoluto el archivo de índice ni el árbol de trabajo (pero restablece el encabezado a <commit>, como lo hacen todos los modos).

+5

Probablemente también valga la pena señalar que esto no sería una buena idea si ha asignado material temático a su rama principal en un repositorio del que extraen otras personas. O al menos, si necesita hacer un reinicio, tendrá que decirle a la gente que eso es lo que está haciendo para que las advertencias de su próxima extracción no sean demasiado impactantes. –

+0

En realidad, todavía no hice ningún commit. Muy fácil, gracias amigo – willcodejavaforfood

+19

Nota para futuros lectores: lea de abajo hacia arriba (o asegúrese de leer todo). 'git reset --hard' destruirá sus cambios, y si aún no están comprometidos, ¡son irrecuperables! Es posible que solo necesites 'git checkout -b ...' –

15

Ya que no han hecho todavía ningún commit, puede guardar todos los cambios en el escondite, crear y cambiar a una nueva rama, a continuación, hacer estallar esos cambios de nuevo en su árbol de trabajo:

git stash # save local modifications to new stash 
git checkout -b topic/newbranch 
git stash pop # apply stash and remove it from the stash list 
+7

o como VonC señaló 'git checkout -b newbranch' y omita el alijo – willcodejavaforfood

+0

@will: Estaba pensando que la creación de una nueva rama sobrescribiría cualquier cambio no confirmado que tuviera, pero si este no es el caso, sí puede omitir el alijo. – Ether

+1

Lo probé y funcionó bien, git es muy atento y no sobrescribirá ningún cambio local – willcodejavaforfood

162

igual declarado en esta pregunta: Git: Create a branch from unstagged/uncommited changes on master: escondite no es necesario.

sólo tiene que utilizar:

git checkout -b topic/newbranch

Cualquier trabajo no comprometida será llevado, a la nueva rama.

Si se intenta empujar obtendrá el siguiente mensaje de

fatal: La corriente de ramas de características/NEWBRANCH tiene ninguna rama aguas arriba.Para empujar la rama actual y establecer la distancia como aguas arriba, utilizar

git push --set-upstream origin feature/feature/NEWBRANCH 

Sólo haz como se sugiere para crear la rama remota:

git push --set-upstream origin feature/feature/NEWBRANCH

+5

ya lo he hecho dos veces. ¡¡¡Funciona genial!!! – simgineer

+1

Obtendrá el error "sin rama ascendente" solo si presiona la nueva bifurcación, no cuando confirma el nuevo trabajo. – sam

+1

@sam He modificado la respuesta en consecuencia –

51

siga estos pasos:

  1. Crear una nueva sucursal:

    git branch newfeature 
    
  2. Pedido nueva rama: (esto no se restablecerá su trabajo.)

    git checkout newfeature 
    
  3. Ahora comprometen su trabajo en esta nueva rama:

    git commit -s 
    

Utilizando los pasos anteriores mantendrá su rama original limpia y no tendrá que hacer ningún 'reinicio de git --hard'.

+1

¿Qué hacen las '-s' en el paso 3? –

+7

@ScottBiggs No es necesario, pero es una práctica que algunas personas siguen. Es [abreviatura de "--signoff"] (https://git-scm.com/docs/git-commit) y agrega su nombre de usuario a la confirmación para que las personas futuras que miran los registros sepan que usted aprueba este compromiso. . –

+2

Buena respuesta, pero no es necesario '-s' en el paso 3. –

2

Para añadir nuevos cambios a una nueva rama y empuje a distancia:

git branch branch/name 
git checkout branch/name 
git push origin branch/name 

Muchas veces me olvide de agregar el elemento origen de empujar y conseguir confundido por qué no veo la nueva sucursal/commit en bitbucket

Cuestiones relacionadas