2010-06-11 16 views
8

Después de trabajar durante varias semanas con media docena de ramas y fusiones diferentes, tanto en mi computadora portátil y mi escritorio como en mi hogar, mi historia se ha vuelto un poco intrincada. Por ejemplo, acabo de buscar, luego fusioné el maestro con el origen/maestro. Ahora, cuando hago git show-ramas, la salida es el siguiente:cómo usar git rebase para limpiar una historia intrincada

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

me gustaría limpiar esto con un git rebase. Creé una nueva rama, rebase-master, para este propósito, y en esta rama intenté git rebase < common-ancestor >. Sin embargo, tengo que resolver muchos conflictos, y el resultado final en branch rebase-master ya no coincide con la versión correspondiente en master, ¡que ya ha sido probado y funciona!

Pensé que había visto una solución a esto en algún lado pero ya no puedo encontrarlo. ¿Alguien sabe como hacer esto? ¿O desaparecerán estos complicados nombres de las referencias cuando empiece a eliminar ramas innecesarias con las que ya me he fusionado?

Soy el único desarrollador de este proyecto, por lo que no habrá nadie más que se vea afectado.

+9

;-) Nota filosófica: La historia se complica. Eso es hecho de la vida. Superalo. –

Respuesta

5

El proceso normal, para las cesiones temporales donde se puede forzar a empujar una rama (en sustitución de la historia remota por uno nuevo creado localmente por un rebase), es hacer:

git rebase --interactive 

Pero, de nuevo, eso es sólo válido si es el único que extrae de sus repositorios, e incluso entonces tendrá que reiniciar algunas de sus sucursales locales a los nuevos rastreadores remotos que se han reescrito.

Desde la sesión de rebase, puede trimming Git commits and squash history, para obtener el tipo de historial que necesita.

+0

Vea también http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC

+0

umm ... es bastante válido sin tirar desde el control remoto. puede rebase fácilmente -i (o básicamente casi cualquier cosa) rama local, rama remota, confirmar. – xenoterracide

10

La mejor manera de limpiar una historia intrincada es mantener la historia lineal. Lo haces evitando cualquier tipo de combinación que no sea de avance rápido.

El flujo de trabajo es el siguiente.

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

Cuando llega el momento de integrar la rama en el maestro, no la fusione. En cambio, rebase esta rama contra el maestro. Eso hará que la rama ya no parezca una rama, sino que simplemente crezca más en la parte superior del árbol. Resuelve cualquier conflicto de combinación durante la rebase.

$ git fetch origin 
$ git rebase origin/master 

Ahora, fusionar la rama en el maestro. Esta será una fusión de avance rápido.

$ git checkout master 
$ git merge foobranch 

Y ahora empuja el trabajo hacia arriba.

$ git push