- 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 :
git add $FILES_YOU_FIXED
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
- Ajoutez avec
git add les changements à absorber
- Exécutez
git absorb
- Si le résultat vous convient, exécutez
git rebase -i --autosquash
- 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
Commentaires sur Hacker News
Les personnes qui utilisent
git absorbestiment que cet outil est très utilegit absorbretrouve automatiquement le bon commitSatisfaction avec un alias pour
git commit --fixupgit absorba été essayé, mais il choisissait souvent le mauvais commit parentgit --fixupetgit rebase --autosquashn’ont pas encore été utilisés, mais semblent utilesgit-absorbsemble aller encore un cran plus loinScepticisme vis-à-vis de la modification des commits et de l’historique
magitpermet de créer facilement des commits fixupDécouverte de
git commit --fixupetgit rebase --autosquashgit rebase -irépond à de nombreux besoinsIncompréhension face à l’obsession pour un historique de commits ultra-propre
Il est difficile de comprendre l’idée de choisir parmi les 10 derniers commits celui qu’on peut modifier sans conflit
fixup^tout en résolvant des conflitsCe 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...