- Una versión portada a git de
hg absorb, creado por Facebook
hg absorb podría considerarse una de las mejoras de flujo de trabajo más geniales en los sistemas de control de versiones de los últimos años
- Cuando hay cambios sin commit en el directorio de trabajo sobre un changeset borrador, al ejecutar hg absorb las correcciones sin commit se absorben automáticamente en el changeset ancestro en borrador correspondiente
- Permite realizar una operación tipo hg histedit + "roll" sin crear commits ni definir manualmente reglas de edición del historial
- El comando revisa las líneas modificadas, encuentra el changeset que modificó esas líneas y luego modifica ese changeset para incluir los cambios sin commit
- Si no puede aplicar los cambios sin conflictos, estos permanecen sin commit
- Este flujo de trabajo es muy útil para tareas como aplicar feedback de revisión. Haces cambios en los archivos, ejecutas hg absorb y el mapeo entre cambios y commits se organiza automáticamente. Es una función casi mágica
Escenarios de uso de git absorb
- Tienes una rama feature con varios commits
- Un miembro del equipo revisa la rama y señala algunos bugs
- Tienes correcciones para esos bugs, pero como crees en los commits atómicos, no quieres meterlas todas en un commit opaco llamado fixes
- En vez de buscar manualmente el SHA del commit para
git commit --fixup o ejecutar un rebase interactivo manual, haces lo siguiente:
- git add $FILES_YOU_FIXED
- git absorb --and-rebase
git absorb identifica automáticamente qué commits puede modificar de forma segura y a qué commit pertenece cada cambio staged
- Luego crea commits
fixup! para esos cambios
- Si usas la bandera
--and-rebase, esos commits fixup se integran automáticamente en sus commits correspondientes
- Si no confías en el resultado, puedes revisar manualmente la salida y luego integrar los fixup en la rama feature usando la función incorporada de autosquash de git
Instalación
- Se puede instalar descargando los artefactos de la última release etiquetada
- Hay artefactos para Windows, MacOS y Linux
Uso
- Agrega con
git add los cambios que quieres absorber
- Ejecuta
git absorb
- Si te satisface el resultado, ejecuta
git rebase -i --autosquash
- Si no te satisface, vuelve al estado anterior con
git reset --soft
How it works (roughly)
git absorb comprueba si dos parches P1 y P2 son conmutables
- Por defecto considera los últimos 10 commits
- Para cada fragmento del índice, comprueba si ese fragmento es conmutable con el último commit
- Cuando encuentra un commit no conmutable, convierte ese fragmento en un commit fixup
Configuration
Stack size
- Por defecto considera los últimos 10 commits
- Para considerar más commits, configura el valor
maxStack en .gitconfig
One fixup per fixable commit
- Por defecto crea un commit fixup separado para cada fragmento absorbible
- Con la bandera
-F, se puede crear solo un commit fixup para todos los fragmentos absorbidos en el mismo commit
Auto-stage all changes if nothing staged
- Por defecto solo considera archivos staged
- Para stagear automáticamente todos los cambios cuando no haya nada staged, configura
autoStageIfNothingStaged
Fixup target always SHA
- Por defecto el mensaje del commit fixup apunta al resumen del commit objetivo
- Se puede configurar para que siempre apunte al SHA del objetivo
TODO
- Implementar una bandera force
- Implementar verificación de la rama base remota
- Agregar una pequeña bandera force para desactivar comprobaciones de seguridad individuales
- Asegurar que toda la salida de errores sea útil para el usuario
- Mostrar más logs cuando tenga éxito
- Agregar más tests
- Documentar los detalles del stack y la conmutación
- Agregar más casos de conmutación
- Implementar que no se carguen todos los fragmentos en memoria al mismo tiempo
- Implementar bloqueo del índice para proteger contra modificaciones simultáneas
Resumen de GN⁺
git absorb es una herramienta portada desde hg absorb de Facebook que mejora el flujo de trabajo de desarrollo al corregir commits automáticamente
- Es especialmente útil al aplicar feedback de revisión, ya que procesa todo automáticamente sin necesidad de buscar o corregir commits manualmente
- Otra herramienta que ofrece una función similar es git-autofixup. Genera automáticamente commits fixup basados en los mensajes de commit
- La ventaja es que facilita incorporar feedback de code review y mantiene más limpio el historial de commits. La desventaja es que depender demasiado de la automatización puede producir resultados inesperados
2 comentarios
Comentarios en Hacker News
Quienes usan
git absorbconsideran que esta herramienta es muy útilgit absorbencuentra automáticamente el commit correctoEstán satisfechos usando un alias para
git commit --fixupProbaron
git absorb, pero muchas veces elegía mal el commit padreNo han usado
git --fixupnigit rebase --autosquash, pero parecen útilesgit-absorbparece ir un paso más alláSon escépticos respecto a modificar commits e historial
Con
magitse pueden crear commits fixup fácilmenteDescubrieron
git commit --fixupygit rebase --autosquashgit rebase -icubre distintas necesidadesNo entienden la obsesión con un historial de commits ultralimpio
No entienden elegir entre los últimos 10 commits uno editable sin conflictos
fixup^con frecuenciaEste comentario sí me pegó. Probé un poco
fixup/autosquash, pero me dejó pensando si será algo que solo me importa a mí y me dio un pequeño bajón existencial...