Crear rama Git con cambios actuales

851

Comencé a trabajar en mi rama maestra 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 ?

willcodejavaforfood
fuente
44
Sí, estas son preguntas duplicadas, pero la redacción es tan diferente que creo que es útil mantenerla. Tenga en cuenta las palabras clave aquí: branch current changesvs existing uncommited branch. Cualquiera que hable inglés verá de inmediato que son iguales, pero los motores de búsqueda probablemente no. Guarda esta pregunta.
Scott Biggs

Respuestas:

691

Si aún no ha realizado ninguna confirmación, solo (1: rama) y (3: pago) serían suficientes.
O, en un comando:git checkout -b newBranch

Como se menciona en la git resetpágina del manual :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Has realizado algunas confirmaciones, pero te das cuenta de que era prematuro estar en la masterrama " ". Desea continuar puliéndolos en una rama de tema, así que cree una " topic/wip" rama de la actual HEAD.
  2. Rebobina la masterrama para deshacerte de esos tres commits.
  3. Cambie a la topic/wiprama " " y siga trabajando.

Nota: debido al efecto "destructivo" de un git reset --hardcomando (restablece el índice y el árbol de trabajo. Cualquier cambio en los archivos rastreados en el árbol de trabajo ya que <commit>se descartan), preferiría ir con:

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

Esto aseguraría que no estoy perdiendo ningún archivo privado (no agregado al índice).
La --softopción no tocará el archivo de índice ni el árbol de trabajo (pero reinicia la cabeza <commit>, al igual que todos los modos).


Con Git 2.23+ , el nuevo comandogit switch crearía la rama en una línea (con el mismo tipo de reset --hard, así que tenga cuidado con su efecto):

git switch -f -c topic/wip HEAD~3
VonC
fuente
66
Probablemente también valga la pena señalar que esta no sería una buena idea si ha enviado material de tema a su rama maestra en un repositorio del que otras personas obtienen. O al menos, si necesita hacer un reinicio, deberá decirle a la gente que es lo que está haciendo para que las advertencias de su próximo tirón no sean demasiado impactantes.
Andrew Walker
39
Nota para futuros lectores: lea de abajo hacia arriba (o asegúrese de leerlo todo). git reset --hardbombardeará tus cambios, y si aún no están comprometidos, ¡son irrecuperables! Puede que solo necesitegit checkout -b …
Conrad Meyer
3
@ConradMeyer Buen punto. Edité la respuesta y puse la git checkout -bprimera.
VonC
55
¿Por qué tema / rama? ¿Por qué no solo nombre de sucursal? ¿Hay alguna razón especial para este nombre? sólo me preguntaba.
Sam Stoelinga
1
@ Es solo una convención de nomenclatura de espacio de nombres (una forma de clasificar fácilmente ramas, usando nombres de ramas jerárquicos para definir espacios de nombres): stackoverflow.com/a/2527436/6309 . Por ejemplo, para problemas: randyfay.com/content/… . No tiene que usar una jerarquía al nombrar sus ramas. topic_wipfuncionaría también;)
VonC
269

Como se indica en esta pregunta: Git: cree una rama a partir de cambios no escalonados / no confirmados en el maestro : el alijo no es necesario.

Solo usa:

git checkout -b topic/newbranch

Cualquier trabajo no comprometido será llevado a la nueva sucursal.

Si intenta presionar, recibirá el siguiente mensaje

fatal: la función de rama actual / NEWBRANCH no tiene rama ascendente. Para empujar la rama actual y configurar el control remoto como ascendente, use

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

Simplemente haga lo sugerido para crear la rama de forma remota:

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

EeKay
fuente
3
Obtendrá el error 'sin rama ascendente' solo si empuja la nueva rama, no cuando confirma el nuevo trabajo.
Sam
2
@sam He modificado la respuesta en consecuencia
Nick Kennedy
73

Sigue estos pasos:

  1. Crea una nueva sucursal:

    git branch newfeature
    
  2. Checkout new branch: (esto no restablecerá su trabajo)

    git checkout newfeature
    
  3. Ahora compromete tu trabajo en esta nueva sucursal:

    git commit -s
    

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

AvadhP
fuente
3
¿Qué hacen las '-s' en el paso 3?
Scott Biggs
12
@ScottBiggs Es innecesario, pero es una práctica que algunas personas siguen. Es la abreviatura de "--signoff" y agrega su nombre de usuario a la confirmación para que las personas futuras que miran los registros sepan que usted aprobó esta confirmación.
Frank Bryce
55
Buena respuesta, pero no es necesario -sen el paso 3.
Mohammed Ali
Aprendí algo nuevo del comentario, gracias @FrankBryce
Kasparov92
30

Como todavía no ha realizado ninguna confirmación, puede guardar todos los cambios en el alijo, crear y cambiar a una nueva rama, luego volver a introducir los cambios 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
Éter
fuente
99
o como VonC señaló 'git checkout -b newbranch' y omita el alijo
willcodejavaforfood
@will: Estaba pensando que crear una nueva rama sobrescribiría cualquier cambio no confirmado que tuvieras, pero si este no es el caso, sí, puedes saltarte el alijo.
Ether
1
Lo probé y funcionó bien, Git es muy atento y la costumbre de sobrescribir cualquier cambio local
willcodejavaforfood
2
Supongo que fue un error tipográfico, pero solo un aviso que git stash pushno es un comando. Probablemente quieras usar git stasho git stash save. Si desea incluir archivos sin seguimiento en el alijo, use la --include-untrackedopción Del mismo modo, si desea incluir archivos no rastreados e ignorados en el alijo, use la --addopción en su lugar.
Seis
en caso de que ya haya creado la rama, esto es útil.
Seguramente
13

Para agregar nuevos cambios a una nueva sucursal y empujar a remoto:

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

Muchas veces me olvido de agregar la parte de origen para presionar y me confundo por qué no veo la nueva rama / commit en bitbucket

Patrick Schaefer
fuente