16 puntos por GN⁺ 2024-09-27 | 2 comentarios | Compartir por WhatsApp
  • 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:
    1. git add $FILES_YOU_FIXED
    2. 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

  1. Agrega con git add los cambios que quieres absorber
  2. Ejecuta git absorb
  3. Si te satisface el resultado, ejecuta git rebase -i --autosquash
  4. 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

 
GN⁺ 2024-09-27
Comentarios en Hacker News
  • Quienes usan git absorb consideran que esta herramienta es muy útil

    • Cuando un PR con varios commits falla en CI, git absorb encuentra automáticamente el commit correcto
    • Evita la molestia de tener que buscar el commit manualmente
    • Casi no hay falsos positivos, y si hay falsos negativos, se pueden manejar manualmente
    • También existe la opinión de que un PR debería ser un solo commit, pero no siempre es así
    • En GitHub se prefieren commits lógicamente pequeños
  • Están satisfechos usando un alias para git commit --fixup

    • Muestra los commits de la rama actual y permite elegir uno mediante fzf
    • Crea un commit fixup basado en el commit seleccionado
  • Probaron git absorb, pero muchas veces elegía mal el commit padre

    • Era mejor buscar el commit manualmente
    • Prefieren tener control total sobre el historial de commits
    • Esta herramienta parece demasiada magia
  • No han usado git --fixup ni git rebase --autosquash, pero parecen útiles

    • git-absorb parece ir un paso más allá
    • En el README no queda claro qué hará exactamente en ciertas situaciones
  • Son escépticos respecto a modificar commits e historial

    • Es mejor corregir el error, crear un nuevo commit y seguir adelante
  • Con magit se pueden crear commits fixup fácilmente

    • Incluso si no usas Emacs, vale la pena mantenerlo solo por magit
    • Para usuarios de vscode, Edamagit es una buena opción
  • Descubrieron git commit --fixup y git rebase --autosquash

    • El git rebase interactivo es su herramienta favorita de Git
    • Ayuda a crear commits atómicos lógicos perfectos
    • Sin embargo, esta edición del historial a veces puede resultar contraproducente
  • git rebase -i cubre distintas necesidades

    • Permite hacer squash, fixup, reword y delete de commits de forma interactiva
    • Todo el que use git debería aprenderlo
  • No entienden la obsesión con un historial de commits ultralimpio

    • Se preguntan si de verdad se revisa el historial de commits con tanto detalle tan seguido
  • No entienden elegir entre los últimos 10 commits uno editable sin conflictos

    • A menudo resuelven conflictos mientras usan fixup^ con frecuencia
    • No confían en seleccionar automáticamente el commit objetivo
 
roxie 2025-05-18
  • No entiendo la obsesión con tener un historial de commits ultra limpio
    • Me pregunto si de verdad revisan el historial de commits con tanto detalle tan seguido

Este 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...