2011-12-27 8 views
43

He clonado un repositorio git de GitHub, he realizado algunos cambios y algunas confirmaciones; Hice bastantes cosas y todas están bastante sucias, por lo que no son adecuadas para una solicitud de extracción. Ahora creé la rama cleanchanges desde origin/master, por lo que está limpia, y quiero confirmar mis cambios allí cuando uno se compromete con un bonito comentario de compromiso.Cambiar a otra rama sin cambiar los archivos de espacio de trabajo

Cuando estoy en el maestro local, quiero cambiar a mi cleanchanges pero sin cambiar los archivos. Y luego puedo comprometerme.

¿Cómo puedo cambiar de ramas sin cambiar los archivos?

Quiero dejar en claro: Tengo todos los cambios confirmados en el local master. No hay cambios sin compromiso.

Respuesta

45

Edit: Acabo de notar que dijiste que ya habías creado algunas confirmaciones. En ese caso, utilice git merge --squash para hacer un solo comprometen:

git checkout cleanchanges 
git merge --squash master 
git commit -m "nice commit comment for all my changes" 

(Editar:. La siguiente respuesta se aplica si tiene no comprometidos cambios)

Sólo tiene que activar ramas con git checkout cleanchanges. Si las ramas hacen referencia a la misma referencia, todos los cambios no confirmados se conservarán en su directorio de trabajo cuando cambie.

La única ocasión en que tendría un conflicto es si algún archivo en el repositorio es diferente entre origin/master y cleanchanges. Si acabas de crear la rama, entonces no hay problema.

Como siempre, si le preocupa perder trabajo, primero haga una copia de seguridad. Git está diseñado para no tirar el trabajo sin preguntarte primero.

+0

Tengo todos los cambios cometidos. – amorfis

+0

En ese caso, ver mi respuesta actualizada. –

6

La mejor apuesta es stash los cambios y la rama del interruptor. Para cambiar ramas, necesitas un estado limpio. Así que guárdelos, compruebe una nueva sucursal y aplique los cambios en la nueva sucursal y complétela

+2

No necesita necesariamente un "estado limpio" para cambiar de ramas. –

+0

El problema es que los cambios ya están comprometidos. – amorfis

+1

Luego puede fusionar los cambios desde otra rama. – vivek85

1

Parece que realizó cambios, comprometiéndolos a dominar el proceso, y ahora desea combinarlos en una sola confirmación.

Si es así, desea rebase sus compromisos, aplastándolos en una única confirmación.

No estoy del todo seguro de lo que quiere exactamente, así que no voy a tentarlo con un guión. Pero le sugiero que lea en git rebase y las opciones para "squash" ing, y pruebe algunas cosas.

1

Otra forma, si desea crear un nuevo commit en lugar de realizar una combinación de:

git checkout cleanchanges 
git reset --hard master 
git reset cleanchanges 

git status 
git add . 
git commit 

El primer reinicio (duro) fijará su árbol de trabajo al igual que la última confirmación en master.

El segundo reinicio colocará su HEAD nuevamente donde estaba, apuntando a la punta de la rama cleanchanges, pero sin cambiar ningún archivo. Entonces ahora puedes agregarlos y enviarlos.


Posteriormente, si desea eliminar el sucio se compromete que creó desde master (y suponiendo que no lo ha hecho los empujó), usted podría:

git checkout master 
git reset --hard origin/master 

Esto descartará todas sus nuevas confirmaciones, devolviendo su rama local master al mismo compromiso que el del repositorio.

21

Git. Cambiar a otra rama

git checkout branch_name 
+11

esto cambiará los archivos del espacio de trabajo a excepción de los archivos sin seguimiento – SMR

+0

aregato gonsaymasu. gracias. –

Cuestiones relacionadas