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 à valider mon code dans cette branche de Git avec des messages non officiels de Git
Dans le référentiel supérieur, nous devons faire un commit pour un bug avec le message officiel de Git
Alors, comment puis-je fusionner ma branche avec une branche distante afin qu’ils n’obtiennent qu’un seul commit pour tous mes enregistrements (je souhaite même fournir un message de commit pour cela)?
Supposons que votre branche de correction de bogue s'appelle bugfix
et que vous souhaitez la fusionner dans 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 les fusionnera avec votre branche master
.
Explication:
git checkout master
Bascule vers votre branche master
.
git merge --squash bugfix
Prend tous les commits de la branche bugfix
et les fusionne avec votre branche actuelle.
git commit
Crée un seul commit à partir des modifications fusionnées.
L'omission du paramètre -m
vous permet de modifier un message de validation brouillon contenant tous les messages de vos commits compressés avant de finaliser votre validation.
Ce qui a finalement été éclairci pour moi, c’est 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 .
Lorsque je souhaite fusionner une branche de fonctionnalité avec 105 validations (!!) et que je les écrase toutes en une seule, je ne souhaite pas git rebase -i Origin/master
, car je dois résoudre séparément les conflits de fusion pour chaque des commits intermédiaires (ou du moins ceux que git ne peut pas déterminer par lui-même). Utiliser git merge --squash
me donne le résultat que je veux, d’une seule validation pour la fusion d’une branche de fonctionnalité entière. Et, je n'ai besoin que de faire au plus une résolution manuelle des conflits.
Vous souhaitez fusionner avec l'option squash. C'est si vous voulez le faire une branche à la fois.
git merge --squash feature1
Si vous voulez fusionner toutes les branches en même temps que des commits simples, commencez par créer une nouvelle base interactive et écrasez chaque fonction, puis fusionnez:
git checkout feature1
git rebase -i master
Squash dans un commit puis répétez l'opération pour les autres fonctionnalités.
git checkout master
git merge feature1 feature2 feature3 ...
Cette dernière fusion est une "fusion de pieuvre" car elle fusionne plusieurs branches à la fois.
J'espère que cela t'aides
Si vous avez déjà git merge bugfix
sur main
, vous pouvez écraser votre validation de fusion en une seule avec:
git reset --soft HEAD^1
git commit
Fusionner la branche newFeature
en master
avec un commit personnalisé:
git merge --squash newFeature && git commit -m 'Your custom commit message';
Si au lieu de cela, vous faites
git merge --squash newFeature && git commit
vous obtiendrez un message de validation contenant toutes les validations de branche newFeature
, que vous pourrez personnaliser.
Je l'explique en détail ici: https://youtu.be/FQNAIacelT4
Je sais que cette question ne concerne pas spécifiquement Github, mais comme Github est si largement utilisé et que c’est la réponse que je cherchais, je vais la partager ici.
Github peut effectuer des fusions de squash, en fonction des options de fusion activées pour le référentiel.
Si les fusions squash sont activées, l'option "Squash and Merge" devrait apparaître dans le menu déroulant sous le bouton "Fusionner".
Supposons que vous travailliez dans la fonction/tâche 1 avec plusieurs validations.
Accédez à votre branche de projet (projet/mon_projet)
git checkout project/my_project
Créer une nouvelle branche (feature/task1_bugfix)
git checkout -b feature/task1_bugfix
Marge avec l'option --squash
git merge --squash feature/task1
Créer un seul commit
git commit -am "add single comments"
Poussez votre branche
git Push --set-upstream Origin feature/task1_bugfix
pour Git
Créer une nouvelle fonctionnalité
via Terminal/Shell:
git checkout Origin/feature/<featurename>
git merge --squash Origin/feature/<featurename>
Cela ne le commet pas, vous permet de le consulter en premier.
Ensuite, validez et terminez la fonction de cette nouvelle branche, et supprimez/ignorez l’ancienne (celle que vous avez créée).