Dans Git, existe-t-il un moyen de fusionner toutes les modifications d'une branche dans une autre, mais de squash en un seul commit en même temps?
Je travaille souvent sur une nouvelle fonctionnalité dans une branche distincte et j'engage / pousse régulièrement - principalement pour la sauvegarde ou pour transférer ce que je travaille sur une autre machine. La plupart du temps, ces commits disent «Feature xxx WIP» ou quelque chose de redondant.
Une fois que le travail est terminé et que je veux fusionner la branche WIP en maître, je voudrais ignorer toutes ces validations intermédiaires, et juste avoir une seule validation propre.
Y a-t-il un moyen facile de faire ceci?
Sinon, que diriez-vous d'une commande qui écrase toutes les validations sur une branche depuis le point où elle a été branchée?
rebase --squash
Je l'ai trouvé! La commande de fusion a une
--squash
optionà ce stade, tout est fusionné, peut-être en conflit, mais pas engagé. Je peux donc maintenant:
la source
git add .
il?git add .
ajoute tous les fichiers non ignorés dans le répertoire courant, je me méfierais de ramasser des fichiers involontaires de cette façon.git add .
vous pouvez utilisergit add -u
pour ajouter uniquement des fichiers qui ont déjà été ajoutés à l'arborescence.Essayez
git rebase -i master
votre branche de fonctionnalités. Vous pouvez ensuite changer tous les "sauf" en "squash" pour combiner les commits. Voir les validations de squashing avec rebaseEnfin, vous pouvez ensuite effectuer la fusion à partir de la branche principale.
la source
Utilisation
git merge --squash <feature branch>
comme réponse acceptée suggère la fait l'affaire, mais elle ne montrera pas la branche fusionnée comme réellement fusionnée.Une meilleure solution consiste donc à:
<feature branch>
dans ce qui précède en utilisantgit merge --squash
Ce wiki explique la procédure en détail.
la source
J'ai créé mon propre alias git pour faire exactement cela. Je l'appelle
git freebase
! Il prendra votre branche de fonctionnalité désordonnée et non rebasable existante et la recréera afin qu'elle devienne une nouvelle branche avec le même nom avec ses validations écrasées en une seule validation et rebasées sur la branche que vous spécifiez (master par défaut). À la toute fin, il vous permettra d'utiliser le message de validation que vous souhaitez pour votre nouvelle branche "freebased".Installez-le en plaçant l'alias suivant dans votre .gitconfig:
Utilisez-le à partir de votre branche de fonctionnalités en exécutant:
git freebase <new-base>
Je ne l'ai testé que quelques fois, alors lisez-le d'abord et assurez-vous que vous voulez l'exécuter. Par mesure de sécurité, il imprime le sha1 de départ, vous devriez donc pouvoir restaurer votre ancienne branche en cas de problème.
Je vais le maintenir dans mon référentiel dotfiles sur github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
la source
git merge --squash <feature branch>
est une bonne option. Le "git commit" vous indique tous les messages de validation de branche de fonctionnalité avec votre choix de le garder.Pour moins de validation, fusionnez.
git merge do x times --git reset HEAD ^ --soft puis git commit.
Risque - les fichiers supprimés peuvent revenir.
la source
Vous pouvez le faire avec la commande "rebase". Appelons les branches «principales» et «fonctionnelles»:
La commande rebase rejouera toutes les validations sur "feature" comme une validation avec un parent égal à "main".
Vous voudrez peut-être exécuter
git merge main
avantgit rebase main
si "main" a changé depuis la création de "feature" (ou depuis la fusion la plus récente). De cette façon, vous avez toujours votre historique complet au cas où vous auriez un conflit de fusion.Après le rebase, vous pouvez fusionner votre branche en main, ce qui devrait entraîner une fusion rapide:
Voir la page de rebase de Understanding Git Conceptually pour une bonne vue d'ensemble
la source