J'ai un serveur Git distant, voici le scénario que je souhaite effectuer:
Pour chaque bug / fonctionnalité, je crée une branche Git différente
Je continue de valider 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 Git
Alors, comment puis-je fusionner ma branche vers une branche distante afin qu'ils obtiennent un seul commit pour tous mes enregistrements (je veux même fournir un message de commit pour cela)?
git
git-merge
git-squash
SunnyShah
la source
la source
git merge --squash
fait tout sur la ligne de commande en un seul coup et vous espérez juste que cela fonctionne.git rebase -i
affiche un éditeur et vous permet d'affiner le rebase. C'est plus lent, mais vous pouvez voir ce que vous faites. En outre, il existe une différence entre rebaser et fusion qui sont un peu trop impliquées pour être abordées dans un commentaire.merge --squash
de l'ancienne vers la nouvelle, puis fusionnez la nouvelle branche pour la maîtriser. L'ancienne branche devient obsolète.Réponses:
Supposons que votre branche de correction de bogues soit appelée
bugfix
et que vous souhaitiez la fusionner enmaster
:Cela prendra toutes les
bugfix
validations de la branche, les écrasera en 1 commit et les fusionnera avec votremaster
branche.Explication :
Bascule vers votre
master
succursale.Prend toutes les validations de la
bugfix
branche et les fusionne avec votre branche actuelle.Crée une validation unique à partir des modifications fusionnées.
L'omission du
-m
paramètre vous permet de modifier un projet de message de validation contenant tous les messages de vos validations écrasées avant de finaliser votre validation.la source
git commit
(sans-m
param) et vous pourrez modifier un message de validation rédigé contenant tous les messages de validation que vous avez écrasés.git commit --amend -m '...'
plus tard.git commit
le message de validation utile ne contenant plus tous les messages de validation que vous avez écrasés ne s'affichera plus. Dans ce cas, essayezgit commit --file .git/SQUASH_MSG
(via stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
vous permet de créer un commit unique au-dessus de la branche actuelle dont l'effet est le même que la fusion d'une autre branche. Mais cela ne produira pas l'enregistrement de fusion, ce qui signifie que votre pull-request en tant que résultat n'aurait aucun changement, mais ne sera pas marqué comme fusionné! Donc, vous aurez juste besoin de supprimer cette branche pour le faire.Ce qui a finalement clarifié cela pour moi, c'est un commentaire montrant que:
est l'équivalent de faire:
Lorsque je veux fusionner une branche de fonctionnalité avec 105 (!!) validations et les avoir toutes écrasées en une seule, je ne veux pas
git rebase -i origin/master
parce que je dois résoudre séparément les conflits de fusion pour chacune des validations intermédiaires (ou au moins celles qui git ne peut pas se comprendre). L'utilisationgit merge --squash
me donne le résultat que je veux, d'un seul commit pour fusionner une branche de fonctionnalité entière. Et, je n'ai besoin que de faire au plus une résolution manuelle des conflits.la source
git merge master
, puis seulementgit merge --squash feature
dans la branche principale.git merge --squash feature
de la branche principale?Vous souhaitez fusionner avec l'option de squash. C'est si vous voulez le faire une branche à la fois.
Si vous souhaitez fusionner toutes les branches en même temps que les validations simples, rebasez d'abord de manière interactive et écrasez chaque fonctionnalité, puis fusionnez le poulpe:
Squash dans un commit puis répétez pour les autres fonctionnalités.
Cette dernière fusion est une "fusion de poulpe" car elle fusionne beaucoup de branches à la fois.
J'espère que cela t'aides
la source
Si vous l'avez déjà
git merge bugfix
activémain
, vous pouvez réduire votre commit de fusion en un seul avec:la source
git reset --soft HEAD^1
semble annuler la dernière validation effectuée avant la fusion, du moins dans le cas où la fusion est une avance rapide.git reset --soft HEAD^<number-of-commits-to-squash>
.Fusionner la
newFeature
branchemaster
avec un commit personnalisé:Si à la place, vous
git merge --squash newFeature && git commit
vous obtiendrez un message de validation qui comprendra toutes les validations de
newFeature
branche, que vous pouvez personnaliser.Je l'explique en détail ici: https://youtu.be/FQNAIacelT4
la source
Je sais que cette question ne concerne pas spécifiquement Github, mais puisque Github est si largement utilisé et que c'est la réponse que je cherchais, je la partagerai ici.
Github a la possibilité d'effectuer des fusions de squash, selon les options de fusion activées pour le référentiel.
Si les fusions de squash sont activées, l'option "Squash and merge" devrait apparaître dans la liste déroulante sous le bouton "Merge".
la source
Supposons que vous ayez travaillé dans feature / task1 avec plusieurs validations.
Accédez à votre branche de projet (project / my_project)
Créer une nouvelle branche (feature / task1_bugfix)
Marge avec l'
--squash
optionCréer un seul commit
Poussez votre branche
la source
Pour Git
Créer une nouvelle fonctionnalité
via Terminal / Shell:
Cela ne le valide pas, vous permet de le consulter en premier.
Ensuite, validez et terminez la fonctionnalité de cette nouvelle branche, et supprimez / ignorez l'ancienne (celle que vous avez développée).
la source
si vous obtenez une erreur: la validation n'est pas possible car vous avez des fichiers non fusionnés.
correction de tous les fichiers de conflit
vous pouvez également utiliser
la source
Pour écraser votre succursale locale avant de la pousser:
extraire la branche en question sur laquelle travailler si elle n'est pas déjà extraite.
Trouvez le sha du plus ancien commit que vous souhaitez conserver.
Créer / extraire une nouvelle branche (tmp1) à partir de ce commit.
git checkout -b tmp1 <sha1-of-commit>
Fusionnez la branche d'origine dans la nouvelle écrasement.
git merge --squash <original branch>
Validez les modifications qui ont été créées par la fusion, avec un message de validation récapitulatif.
git commit -m <msg>
Découvrez la branche d'origine que vous souhaitez écraser.
git checkout <branch>
Réinitialisez le commit d'origine que vous souhaitez conserver.
git reset --soft <sha1>
Rebase cette branche en fonction de la nouvelle branche tmp1.
git rebase tmp1
C'est tout - supprimez maintenant la branche temporaire tmp1 une fois que vous êtes sûr que tout va bien.
la source
Vous pouvez utiliser l'outil que j'ai créé pour faciliter ce processus: git-squash . Par exemple, pour écraser toutes les validations sur la branche de fonctionnalité qui a été branchée à partir de la branche principale, écrivez:
la source