16 points par GN⁺ 2024-09-27 | 2 commentaires | Partager sur WhatsApp
  • Une version portée pour git de hg absorb, créé par Facebook
    • hg absorb peut être considéré comme l’une des améliorations de workflow les plus élégantes apparues dans les systèmes de gestion de versions ces dernières années
    • Lorsqu’il existe des modifications non validées dans le répertoire de travail au-dessus d’un changeset brouillon, exécuter hg absorb absorbe automatiquement ces corrections non validées dans le changeset ancêtre brouillon approprié
    • Cela permet d’effectuer l’équivalent d’une opération hg histedit + "roll" sans créer de commit ni définir manuellement des règles de réécriture d’historique
    • La commande examine les lignes modifiées, retrouve le changeset qui les a modifiées, puis met à jour ce changeset pour y inclure les changements non validés
    • Si les modifications ne peuvent pas être produites sans conflit, elles restent non validées
    • Ce workflow est très utile pour des tâches comme l’application de retours de review. Il suffit de modifier les fichiers puis d’exécuter hg absorb, et le mapping entre les changements et les commits est automatiquement remis en ordre. C’est presque magique

Cas d’usage de git absorb

  • Vous avez une branche de fonctionnalité avec plusieurs commits
  • Un collègue review la branche et signale quelques bugs
  • Vous avez les correctifs, mais comme vous croyez aux commits atomiques, vous ne voulez pas tout mettre dans un commit opaque nommé fixes
  • Au lieu de rechercher manuellement le SHA du commit pour git commit --fixup ou d’exécuter un rebase interactif à la main, faites ceci :
    1. git add $FILES_YOU_FIXED
    2. git absorb --and-rebase
  • git absorb identifie automatiquement quels commits peuvent être modifiés en toute sécurité et quelles modifications staged appartiennent à chaque commit
  • Il crée ensuite des commits fixup! pour ces changements
  • Avec l’option --and-rebase, ces commits fixup sont automatiquement intégrés dans les commits correspondants
  • Si vous ne lui faites pas entièrement confiance, vous pouvez vérifier manuellement le résultat puis utiliser la fonctionnalité intégrée autosquash de git pour intégrer les fixup dans la branche de fonctionnalité

Installation

  • Installation possible en téléchargeant les artefacts depuis la dernière release taguée
  • Des artefacts sont fournis pour Windows, MacOS et Linux

Utilisation

  1. Ajoutez avec git add les changements à absorber
  2. Exécutez git absorb
  3. Si le résultat vous convient, exécutez git rebase -i --autosquash
  4. Sinon, revenez à l’état précédent avec git reset --soft

How it works (roughly)

  • git absorb vérifie si deux patchs P1 et P2 sont commutables
  • Par défaut, il prend en compte les 10 derniers commits
  • Pour chaque hunk de l’index, il vérifie si ce hunk est commutable avec le dernier commit
  • Lorsqu’il trouve un commit non commutable, il transforme ce hunk en commit fixup

Configuration

Taille de la pile

  • Par défaut, il prend en compte les 10 derniers commits
  • Pour prendre en compte davantage de commits, définissez la valeur maxStack dans .gitconfig

Un fixup par commit corrigeable

  • Par défaut, un commit fixup distinct est créé pour chaque hunk absorbable
  • L’option -F permet de ne créer qu’un seul commit fixup pour tous les hunks absorbés dans un même commit

Auto-stage de tous les changements si rien n’est staged

  • Par défaut, seuls les fichiers staged sont pris en compte
  • Pour mettre automatiquement tous les changements en stage lorsqu’il n’y a aucune modification staged, utilisez le paramètre autoStageIfNothingStaged

Cible du fixup toujours en SHA

  • Par défaut, le message du commit fixup fait référence au résumé du commit cible
  • Il est possible de configurer cela pour toujours référencer le SHA de la cible

TODO

  • Implémenter une option de force
  • Implémenter la vérification de la branche par défaut distante
  • Ajouter une petite option de force pour désactiver des vérifications de sécurité individuelles
  • Garantir que tous les messages d’erreur sont utiles à l’utilisateur
  • Afficher davantage de logs en cas de succès
  • Ajouter plus de tests
  • Documenter les détails de la pile et de la commutabilité
  • Ajouter davantage de cas de commutabilité
  • Faire en sorte de ne pas charger simultanément tous les hunks en mémoire
  • Implémenter un verrouillage de l’index pour se protéger des modifications concurrentes

Résumé GN⁺

  • git absorb est un outil porté depuis hg absorb de Facebook, qui améliore le workflow de développement en corrigeant automatiquement les commits
  • Il est particulièrement utile pour appliquer des retours de review, en automatisant le processus sans avoir à rechercher ou modifier manuellement les commits
  • Un autre outil offrant une fonctionnalité similaire est git-autofixup, qui génère automatiquement des commits fixup à partir des messages de commit
  • Avantages : il facilite l’intégration des retours de code review et rend l’historique des commits plus propre. Inconvénient : une dépendance excessive à l’automatisation peut entraîner des résultats inattendus

2 commentaires

 
GN⁺ 2024-09-27
Commentaires sur Hacker News
  • Les personnes qui utilisent git absorb estiment que cet outil est très utile

    • Lorsqu’une PR contenant plusieurs commits échoue en CI, git absorb retrouve automatiquement le bon commit
    • Cela évite la corvée de devoir retrouver le commit manuellement
    • Il y a très peu de faux positifs, et si un faux négatif survient, il suffit de le traiter manuellement
    • Certains pensent qu’une PR devrait se limiter à un seul commit, mais ce n’est pas toujours le cas
    • Sur GitHub, les petits commits logiques sont préférés
  • Satisfaction avec un alias pour git commit --fixup

    • Il affiche les commits de la branche courante et permet d’en choisir un via fzf
    • Il crée ensuite un commit fixup à partir du commit sélectionné
  • git absorb a été essayé, mais il choisissait souvent le mauvais commit parent

    • Il valait mieux retrouver le commit manuellement
    • Une préférence pour garder un contrôle total sur l’historique des commits
    • Cet outil donne l’impression d’avoir trop de magie
  • git --fixup et git rebase --autosquash n’ont pas encore été utilisés, mais semblent utiles

    • git-absorb semble aller encore un cran plus loin
    • Le README n’explique pas clairement ce qu’il fera exactement dans certaines situations
  • Scepticisme vis-à-vis de la modification des commits et de l’historique

    • Il vaut mieux corriger l’erreur, créer un nouveau commit et continuer
  • magit permet de créer facilement des commits fixup

    • Même sans utiliser Emacs, cela vaut la peine de le garder uniquement pour magit
    • Pour les utilisateurs de VS Code, Edamagit est une bonne option
  • Découverte de git commit --fixup et git rebase --autosquash

    • Le rebase interactif de Git est leur outil Git préféré
    • Il aide à créer des commits atomiques logiques parfaits
    • Mais cette réécriture de l’historique peut parfois se retourner contre vous
  • git rebase -i répond à de nombreux besoins

    • Il permet de faire des squash, fixup, reword et delete de commits de façon interactive
    • Toute personne qui utilise git devrait l’apprendre
  • Incompréhension face à l’obsession pour un historique de commits ultra-propre

    • Ils se demandent si l’on consulte vraiment l’historique des commits aussi souvent et en détail
  • Il est difficile de comprendre l’idée de choisir parmi les 10 derniers commits celui qu’on peut modifier sans conflit

    • Il arrive souvent d’utiliser fixup^ tout en résolvant des conflits
    • Il n’y a pas confiance dans la sélection automatique du commit cible
 
roxie 2025-05-18
  • Je ne comprends pas cette obsession pour un historique de commits ultra-propre
    • Je me demande à quelle fréquence on examine vraiment l’historique des commits avec autant de détail

Ce commentaire me parle un peu. J’ai testé rapidement fixup / autosquash, mais ça m’a quand même fait un peu redescendre, en me demandant si au fond j’étais le seul à m’en soucier...