2010-02-23 9 views
21

Desde que hice mi última pregunta which turned out to be about rebasing with GIT, he decidido que no quiero volver a establecer ninguna base de datos. En lugar quiero:Rehacer el historial de confirmaciones en GIT sin Rebase

  1. Branch
  2. trabajo trabajo trabajo, registro de entrada y empujando en todo momento
  3. tirar todos de esas confirmaciones y pretender que nunca sucedió (por lo que uno limpia cometen al final del trabajo)

hago esto actualmente copiando los archivos a un nuevo directorio y luego copiarlos de nuevo a una nueva rama (ramificado en el mismo punto que mi sucursal de trabajo), y luego la fusión que en master o donde sea.

¿Es esto simplemente malo y por qué? Más importante: ¿hay una forma mejor/GIT para hacer esto?git rebase -i me obliga a fusionarme (y elegir, y aplastar).

Respuesta

10

también puede utilizar git merge con la opción --squash.

+1

Squash sucede en cada commit automáticamente, no veo cómo eso ayuda con mi pregunta. No es que no sea así, pero necesitaría más información. –

+2

He usado 'git merge --squash' cuando quería fusionar una rama de tema con el maestro, pero también redujo el historial de confirmaciones a solo una confirmación. 'git merge --squash' lleva a cabo la fusión, pero nos permite proporcionar un mensaje de confirmación antes de comprometer la fusión. Entonces, el resultado final parece haber cometido una sola vez en la rama principal. –

+1

siento que me tomó tres años descubrir que esta respuesta es correcta. ¡Buen trabajo! –

24

Lo más fácil de hacer es un restablecimiento parcial.

Así Comprar Su tema rama:

git checkout -b topic master 

trabajo, trabajo, trabajo.

git commit 
git commit 
git commit 
git commit 

feliz con esto, se puede hacer una nueva única confirmación en la parte superior del maestro

git reset --soft master 
git commit 

Ahora fusionar a dominar (que será un avance rápido) y ordenar la rama tema. (Tenga en cuenta que no necesita hacer esto si está preparado para recordar o etiquetar dónde estaba el maestro y simplemente trabajar en el maestro sin ramificación, podría haber hecho git reset --soft old-master y git commit y no necesitaría estos últimos pasos de limpieza .)

git checkout master 
git merge topic 
git branch -d topic 
+4

Excelente (+1), pero eso deja la pregunta: ¿es esta la manera correcta (con Git o en realidad con cualquier (D) VCS)? todos los pasos incrementales lógicos son aplastados, y si hay algún error desagradable entre los commits por tema, eso no será fácil de identificar y corregir. – VonC

+2

@Charles Bailey, gracias por eso. @VonC, depende. Reviso cada minuto o menos ... demasiada información es tan mala como ninguna. –

+0

Así que para que quede claro, git reset --soft some_branch me cambia a some_branch/some_commit sin tocar mis archivos? –

Cuestiones relacionadas