72 votes

Regrouper un groupe de commits en un seul sur Git

J'ai l'habitude de faire un grand nombre de petits commits, et cela me convient. Mais j'aimerais, de temps en temps, prendre un tas de ces commits linéaires et les regrouper en un seul commit avec la possibilité d'écrire un nouveau message de commit.

J'ai consulté la documentation, mais elle me semble un peu trop obscure. Quelqu'un sait-il comment faire ?

81voto

Ben Amos Points 870

En supposant que vous ne souhaitiez pas conserver vos messages de validation existants, il existe une recette git pratique (et rapide) que vous pouvez utiliser. Tout d'abord, assurez-vous que votre branche est vérifiée :

git checkout <branch-to-squash>

Pour plus de sécurité, marquons le commit actuel.

git tag my-branch-backup

Ensuite, déplacez la branche HEAD jusqu'à votre dernier bon commit (sans modifier l'espace de travail ou l'index). EDIT : Le dernier bon commit est le commit le plus récent sur votre branche que vous souhaitez conserver.

git reset --soft <last-good-commit>

Utilisation git status vous remarquerez que tous les changements sur votre branche de fonctionnalité sont maintenant mis en scène. Il ne reste plus qu'à ...

git commit

Cette méthode est idéale pour consolider les historiques git longs et alambiqués et les fusions difficiles. De plus, il n'y a pas de conflits merge/rebase à résoudre !

Maintenant, si vous avez besoin de conserver vos messages de validation existants ou de faire quelque chose de plus fantaisiste que ce qui précède, vous devrez utiliser git rebase --interactive .

Solution dérivée de : http://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

Référence : http://git-scm.com/docs/git-reset

Référence : http://git-scm.com/docs/git-rebase

56voto

yfeldblum Points 42613

Supposons que vous souhaitiez réécrire l'historique de l'arbre en remontant jusqu'à (mais sans inclure) le commit a739b0d .

export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive

Ne manquez pas de vous renseigner sur rebasement interactif d'abord.

18voto

kevmo Points 50

Utilisez la commande git rebase -i <commit> donde <commit> est le SHA du dernier commit stable.

Vous accéderez ainsi à votre éditeur où vous pourrez remplacer l'étiquette pick qui se trouve à côté de chaque commit depuis que le <commit> que vous avez inclus comme argument dans votre commande interactive rebase. Sur la commande à partir de laquelle vous voulez commencer à réduire, remplacez pick con reword et pour chaque engagement ultérieur que vous souhaitez y intégrer, remplacez pick con fixup . Sauvegardez, et vous serez alors autorisé à fournir un nouveau message de validation.

7voto

Matt Ball Points 165937

Vous pouvez écraser n'importe quel nombre de commits en un seul en utilisant

git rebase --interactive <commit>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X