git absorb - `git commit --fixup` automatisé
(github.com/tummychow)- Une version portée pour git de
hg absorb, créé par Facebookhg absorbpeut ê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 absorbabsorbe 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 --fixupou d’exécuter un rebase interactif à la main, faites ceci :git add $FILES_YOU_FIXEDgit absorb --and-rebase
git absorbidentifie 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 commitsfixupsont 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
autosquashde git pour intégrer lesfixupdans 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 addles 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 absorbvé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
maxStackdans.gitconfig
Un fixup par commit corrigeable
- Par défaut, un commit
fixupdistinct est créé pour chaque hunk absorbable - L’option
-Fpermet de ne créer qu’un seul commitfixuppour 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
fixupfait 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 absorbest un outil porté depuishg absorbde 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...