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)?

813
demandé sur naXa 2011-03-15 10:47:44

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.

1340
répondu abyx 2018-04-24 16:23:18

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

88
répondu Adam Dymitruk 2013-08-15 15:07:12

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.

84
répondu dankohn 2014-08-19 15:59:21

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
20
répondu qwertzguy 2015-03-13 17:50:29

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.

6
répondu Vagelis Prokopiou 2017-03-17 11:10:32

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).

0
répondu Demian Berisford-Maynard 2018-07-12 15:14:14