Comment utiliser --squash de fusion git?
-
24-10-2019 - |
Question
J'ai un serveur distant Git, voici le scénario que je veux effectuer:
-
Pour chaque bug / fonctionnalité que je crée une branche Git différente
-
je continue à commettre mon code dans cette branche Git avec des messages Git un-officiels
-
En haut dépôt, nous devons faire un commettras pour un bug avec le message officiel Git
Alors, comment puis-je fusionner ma branche à distance afin qu'ils obtiennent juste un commettras pour tous mes check-ins (je veux même de fournir le message de validation pour cela)?
La solution
Supposons que votre branche de correction de bug est appelé bugfix
et que vous souhaitez fusionner dans master
:
git checkout master
git merge --squash bugfix
git commit
Cela prendra toutes les commits de la branche bugfix
, les courge en 1 commettras et fusionner avec votre branche master
.
Explication :
git checkout master
Commutateurs à votre branche master
.
git merge --squash bugfix
prend toutes les commits de la branche bugfix
et se confond avec votre branche actuelle.
git commit
Crée un commettras de la fusionner les modifications.
Omettre le paramètre -m
vous permet de modifier un projet de message de commit contenant tous les messages de vos commits écrasements avant de finaliser votre livraison.
Autres conseils
Ce qui a finalement éclairci ce 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 ont tous écrasés en un seul, je ne veux pas git rebase -i origin/master
parce que je dois séparément résoudre les conflits de fusion pour chaque des commits intermédiaires (ou du moins ceux qui git ne peuvent pas comprendre lui-même). L'utilisation git merge --squash
me obtient le résultat que je veux, d'un seul commettras pour fusionner une branche de fonctionnalité entière. Et, je ne dois faire au plus une résolution manuelle des conflits.
Vous souhaitez fusionner avec l'option squash. C'est si vous voulez faire une branche à la fois.
git merge --squash feature1
Si vous souhaitez fusionner toutes les branches en même temps que commits unique, puis la première rebasage interactive et de squash chaque fonction puis poulpes fusion:
git checkout feature1
git rebase -i master
Squash dans un commettras puis répétez l'opération pour les autres fonctions.
git checkout master
git merge feature1 feature2 feature3 ...
Cette dernière fusion est une « fusion de poulpe » parce qu'il est la fusion d'un grand nombre de branches à la fois.
Hope this helps
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
branche Fusion newFeature
en master
avec une coutume commit:
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 comprendra tous les commits de branche newFeature
, que vous pouvez personnaliser.
Je l'explique bien ici: https://youtu.be/FQNAIacelT4
Je sais que cette question ne concerne pas spécifiquement Github, mais depuis Github est si largement utilisé, ce qui est la réponse que je cherchais, je vais partager ici.
Github a la capacité d'effectuer des fusions de squash, en fonction des options de fusion activées pour le dépôt.
Si la courge se confond sont activées, l'option « Squash et fusion » devrait apparaître dans le menu déroulant sous le bouton « Merge ».
Supposons que vous avez travaillé fonctionnalité / Task1 avec plusieurs commits.
-
Accédez à votre branche de projet (projet / my_project)
git checkout project/my_project
-
Créer une nouvelle branche (fonction / task1_bugfix)
git checkout -b feature/task1_bugfix
-
Marge avec l'option
--squash
git merge --squash feature/task1
-
Créer un commettras
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>
Ce ne marche pas commettre, vous permet de vérifier d'abord.
Ensuite, commit et fonction d'arrivée de cette nouvelle branche, et supprimer / ignorer l'ancien (celui que vous avez fait sur dev).