tutorial - git reset




cómo usar git rebase para limpiar una historia intrincada (2)

Después de trabajar durante varias semanas con media docena de diferentes sucursales y fusiones, tanto en mi computadora portátil y mi trabajo como en mi computadora de escritorio 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-branches, la salida se ve así:

! [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 lugar, pero no puedo encontrarlo más. ¿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.


La mejor forma 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 así.

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

Cuando sea el momento de integrar la rama en el maestro, no la combines. 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, combine la rama en el maestro. Esta será una fusión de avance rápido.

$ git checkout master
$ git merge foobranch

Y ahora empuje el trabajo en sentido ascendente.

$ git push

El proceso normal, para los repos donde puede forzar el envío de una rama (reemplazando el historial remoto por uno nuevo creado localmente por una rebase), es hacer:

git rebase --interactive

Pero nuevamente, eso solo es válido si usted es el único que extrae de sus repositorios, e incluso entonces tendrá que reinicializar algunas de sus sucursales locales a los nuevos rastreadores remotos que se han reescrito.

Desde la sesión de rebase, puedes recortar las confirmaciones de Git y aplastar el historial para obtener el tipo de historial que necesitas.





rebase