Question 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 différente de Git

  • 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 officiel de Git

Alors, comment puis-je fusionner ma branche à la branche distante afin qu'ils obtiennent un seul commit pour tous mes check-ins (je veux même fournir un message de validation pour cela)?


763
2018-03-15 07:47


origine


Réponses:


Dites que votre branche de correction de bugs est appelée bugfix et vous voulez le fusionner en master:

git checkout master
git merge --squash bugfix
git commit

Cela prendra tous les engagements de la bugfix branche, écrasez-les en 1 commit, et fusionnez-le avec votre master branche.


Explication:

git checkout master

Bascule vers votre master branche.

git merge --squash bugfix

Prend tous les engagements de la bugfix branchez et fusionne avec votre branche actuelle.

git commit

Crée une seule validation à partir des modifications fusionnées.

Omettre le -m Ce paramètre vous permet de modifier un message de validation de brouillon contenant tous les messages de vos commits écrasés avant de finaliser votre validation.


1259
2018-03-15 08:16



Vous voulez 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 les commits uniques, alors commencez par rebaser de manière interactive et écrasez chaque entité puis fusionnez les poulpes:

git checkout feature1
git rebase -i master

Squash en 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 de poulpe" car elle fusionne beaucoup de branches à la fois.

J'espère que cela t'aides


84
2018-03-15 08:08



Ce qui finalement éclairci cela 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 caractéristique avec 105 (!!) commits et les avoir tous écrasés en un, je ne veux pas git rebase -i origin/master parce que 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 comprendre lui-même). En utilisant git merge --squash obtient le résultat que je veux, d'un seul commit pour fusionner une branche entière. Et, j'ai juste besoin de faire au plus une résolution de conflit manuelle.


81
2017-08-19 15:59



Si vous avez déjà git merge bugfix sur main, vous pouvez écraser votre commit de fusion en un avec:

git reset --soft HEAD^1
git commit

19
2018-03-13 17:50



Fusionner newFeature branche en master avec un commit personnalisé:

git merge --squash newFeature && git commit -m 'Your custom commit message';

Si au contraire, vous faites

git merge --squash newFeature && git commit

vous obtiendrez un message de validation qui inclura tous les newFeature commits de branche, que vous pouvez personnaliser.


6
2018-03-17 11:10



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 revoir en premier.

Ensuite, validez et terminez la fonctionnalité de cette nouvelle branche, et supprimez / ignorez l'ancienne (celle que vous avez créée).


0
2017-10-05 14:33