web-dev-qa-db-fra.com

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

1031
SunnyShah

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.

1702
abyx

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.

106
Dan Kohn

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

92
Adam Dymitruk

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
21
qwertzguy

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

9
Vagelis Prokopiou

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

Screenshot of "Squash and merge" Github feature

5
Aaron

Supposons que vous travailliez dans la fonction/tâche 1 avec plusieurs validations.

  1. Accédez à votre branche de projet (projet/mon_projet)

    git checkout project/my_project
    
  2. Créer une nouvelle branche (feature/task1_bugfix)

    git checkout -b feature/task1_bugfix
    
  3. Marge avec l'option --squash

    git merge --squash feature/task1
    
  4. Créer un seul commit

    git commit -am "add single comments"
    
  5. Poussez votre branche

    git Push --set-upstream Origin feature/task1_bugfix
    
2
Farid Haq

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