2010-11-04 4 views
5

No sé Git tan bien y para uno de nuestros repositorios, cometí un error.Git se bifurca de una revisión anterior y deshace la rama actual

Incursioné y realicé cambios en una rama llamada "núcleo". Pero luego me di cuenta de que mis cambios no deberían estar allí; debería haber creado una nueva rama varias revisiones atrás, por ejemplo, "core-experimental".

Para explicar, tengo:

A---B---C---D---E  "core" 

Pero ahora quiero cambiarlo a

A---B    "core" 
    \ 
    C---D---E  "core-experimental" 

Nadie más en mi equipo ha tirado mis cambios, sin embargo, por lo que cualquier revierte hago shouldn no causa dolor a nadie

¿Es esto posible para Git?

Respuesta

9

Las otras dos respuestas funcionan bien, pero en realidad se pueden evitar tener que hacer nada en su árbol de trabajo:

# create core-experimental using core as starting point 
git branch core-experimental core 
# move core 
git branch -f core <SHA1 of B> 

De esta manera usted puede hacer incluso si tiene modificaciones locales en el árbol de trabajo, y sin actualizar un montón de marcas de tiempo durante el proceso de pago/restablecimiento, lo que hará que tenga que reconstruir (suponiendo que se trata de un proyecto compilado).

+0

Bueno, este es el tipo de pequeño extra que pule mi git-fu – Benjol

+0

que estoy usando haciendo Ruby/Python/cosas no compiladas, así que juego loosey-goosey w/file timestamps; esta sugerencia es mejor –

+0

@ Adam: Sí, nunca estoy seguro. A veces, un 'reset --hard' es gratuito, a veces en un gran proyecto compilado, el reinicio/pago demora 20 segundos y obliga a una compilación de 10 minutos. Otra distinción: el 'reset' pondrá en los reflogs" : actualizando HEAD ", mientras que' branch -f' pondrá "branch: Reset en ". – Cascabel

6
git checkout core 
git branch core-experimental 
git reset --hard <SHA of B> 
git push -f <remote> core 

O más descriptivamente ...

  1. Pedido núcleo
  2. Cree la rama experimental a la cabeza del núcleo
  3. CABEZA del núcleo
  4. reinicio de nuevo a donde usted quiere que
  5. forzar un empuje de la actualización core
+0

Esto funcionó bien, incluso con el núcleo empujado al origen (que tenía, a diferencia del que pregunta). –

1

In core:

git branch core-experimental 
git reset --hard <revision-B> 

Y luego:

git push -f 
Cuestiones relacionadas