2009-09-21 9 views
75

Hay una carpeta controlada por git en un servidor donde la rama principal está desprotegida y una pila completa de archivos ha sido modificada y no confirmada. ¿Hay alguna manera de que pueda enviar los cambios a una sucursal separada para que pueda volver a una versión limpia?¿Git crea una bifurcación desde el maestro actual desprotegido?

es decir, quiero deshacer de forma efectiva todos los cambios de esta persona, pero almacénelos en otra oportunidad, de modo que si esa persona desea sus cambios, puede cambiar a esa rama.

(Sí, sé que esto no es cómo git está diseñado para funcionar, pero esa es mi situación). Cualquier idea es muy apreciada.

+1

similar a . y bueno, git funciona muy bien en tu caso, no diría que no está diseñado para tal flujo de trabajo. ¡es! – knittl

+0

Solo por aclaración, espero que los cambios nunca se usen, pero sí necesito un registro permanente por si acaso. – corydoras

Respuesta

132

Ante todo se mueve a una rama diferente, basado en el HEAD y se realiza así:

git checkout -b newbranch 

Commit todos los cambios (suponiendo que no hay archivos recién añadidos, de lo contrario git add ellos):

git commit -a 

volver a la rama principal:

git checkout master 

la previamente unco todos los cambios en la rama newbranch estarán disponibles, y el maestro seguirá estando en el estado en el que se encontraba sin esos cambios.

+5

* Explicación: * los contenidos del repositorio de trabajo y los cambios escalonados no pertenecen a ninguna rama. Crear una nueva ramificación simple HEAD (última revisión) es suficiente para que el nuevo compromiso se acabe de crear rama ''. –

+0

Gracias chicos, pensé que cambiar a una nueva rama podría borrar los cambios. Viniendo de un fondo SVN no pensé que cambiar así era posible. Pruébelo ahora. – corydoras

+0

Perfecto, lo hizo muy bien como usted decir! Git es un poco genial (: – corydoras

13

Siempre puede esconder los cambios.

git stash 
git checkout -b bravenewmaster 
git stash apply 

También hay que tener en cuenta, que si se comprometen a la rama "equivocado" siempre se puede mover esa rama de nuevo, ya que la rama no es más que un puntero a una confirmación.

+3

¿Por qué molestarse en esconder si va a volver a aplicar inmediatamente los mismos cambios? También puedes hacer 'git checkout -b bravenewmaster'. Es menos tipeo y no tocará todos los archivos modificados innecesariamente. –

+1

Bueno, no lo he intentado, pero asumí que 'git' por alguna razón no permite' git checkout -b' cuando hay cambios. De lo contrario, ¿por qué pregunta? ;-) –

+0

En realidad, por lo que puedo decir con "Deseo deshacer de manera efectiva todos los cambios de esta persona, pero los almaceno en otra oportunidad, así que si esa persona quiere sus cambios, pueden cambiar a esa rama", el almacenamiento aislado debería ser suficiente con no ramificar y aplicar. –

13

Este método es útil:

git checkout -B <new_branch> <start point> 

Donde:

  • <new_branch> es su nueva rama (por ejemplo my_branch)
  • <start point> es su rama de partida (master en su caso)
  • -B crea una nueva rama a partir de <start point>, i si ya existe, reinícielo a (no fallará como -b cuando la sucursal ya existe)
  • a veces -m puede ser útil para especificar al cambiar de ramas, esto realizará una fusión tripartita entre la rama actual, su funcionamiento contenido de árbol (útil para secuencias de comandos).

Ver: man git-checkout para más detalles.

Cuestiones relacionadas