Comment utiliser git merge --squash?
J'ai un serveur Git distant, voici le scénario que je veux effectuer:
-
Pour chaque bug / Fonctionnalité, je crée une branche Git différente
-
Je continue à commettre mon code dans cette branche Git avec des messages git non officiels
-
Dans le référentiel supérieur, nous devons faire un commit pour un bug avec le message git officiel
Alors, comment puis-je fusionner ma branche à la branche distante afin qu'ils n'obtiennent qu'un seul commit pour tous mes check-ins (je veux même fournir un message de validation pour cela)?
6 réponses
Dites que votre branche de correction de bogue s'appelle bugfix
et que vous voulez la fusionner en master
:
git checkout master
git merge --squash bugfix
git commit
Cela prendra tous les commits de la branche bugfix
, les écrasera en 1 commit, et le fusionnera avec votre branche master
.
Explication:
git checkout master
Passe à votre branche master
.
git merge --squash bugfix
Prend tous les commits de la branche bugfix
et la fusionne avec votre branche actuelle.
git commit
Crée un commit unique à partir du changement.
Omettre le paramètre -m
vous permet de modifier un message de commit brouillon contenant chaque message de vos commits écrasés avant de finaliser votre commit.
Vous souhaitez fusionner avec l'option squash. C'est si vous voulez faire une branche à la fois.
git merge --squash feature1
Si vous voulez fusionner toutes les branches en même temps que des commits simples, rebase d'abord interactivement et écrase chaque fonctionnalité puis Octopus merge:
git checkout feature1
git rebase -i master
Squash dans un commit puis répétez pour les autres fonctionnalités.
git checkout master
git merge feature1 feature2 feature3 ...
Cette dernière fusion est une "fusion octopus" car elle fusionne beaucoup de branches à la fois.
J'espère que cela aide
Ce qui a finalement éclairci pour moi était un commentaire montrant que:
git checkout main
git merge --squash feature
Est l'équivalent de faire:
git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .
Quand je veux fusionner une branche de fonctionnalité avec 105(!!) commits et les avoir tous écrasés en un seul, Je ne veux pas git rebase -i origin/master
parce que j'ai besoin de résoudre séparément les conflits de fusion pour chaque des commits intermédiaires (ou au moins ceux que git ne peut pas comprendre lui-même). L'utilisation de git merge --squash
me donne le résultat que je veux, d'un seul commit pour fusionner un branche de fonctionnalité entière. Et, je n'ai besoin que de faire au plus une résolution manuelle des conflits.
Si vous avez déjà git merge bugfix
sur main
, Vous pouvez écraser votre commit de fusion en un seul avec:
git reset --soft HEAD^1
git commit
Fusionner newFeature
branche dans master
avec un commit personnalisé:
git merge --squash newFeature && git commit -m 'Your custom commit message';
Si à la place, vous faites
git merge --squash newFeature && git commit
Vous obtiendrez un message de validation qui inclura toutes les validations de la branche newFeature
, que vous pouvez personnaliser.
Pour Git
Créer une nouvelle fonctionnalité
Via Terminal / Shell:
git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>
Cela ne le commit pas, vous permet de le revoir en premier.
Ensuite, validez, et terminez la fonctionnalité de cette nouvelle branche, et supprimez/ignorez l'ancienne (celle sur laquelle vous avez dev).