1779 votes

Comment puis-je fusionner plusieurs commits sur une autre branche en un seul commit écrasé ?

J'ai un serveur Git distant, voici le scénario que je veux réaliser :

  • Pour chaque bogue/caractéristique, je crée une branche Git différente.

  • Je continue à commiter mon code dans cette branche Git avec des messages Git non officiels.

  • Dans le dépôt supérieur, nous devons faire un commit pour un bug avec le message officiel de Git.

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

1 votes

Je ne suis pas sûr d'avoir bien compris, mais vous pourriez vouloir une "fusion pieuvre".

1 votes

Voulez-vous garder les commits individuels sur ces autres branches ?

36 votes

J'utilise généralement git rebase -i pour regrouper tous mes commits en un seul et réécrire le message de commit. Puis je l'envoie en amont.

25voto

qwertzguy Points 1021

Si vous avez déjà git merge bugfix sur main vous pouvez regrouper vos commandes de fusion en une seule avec :

git reset --soft HEAD^1
git commit

0 votes

git reset --soft HEAD^1 semble annuler la dernière livraison effectuée avant la fusion, au moins dans le cas où la fusion est une avance rapide.

0 votes

@JesperMatthiesen dans le cas d'un fast-forward vous n'obtenez pas de commit de fusion, donc vous feriez alors git reset --soft HEAD^<number-of-commits-to-squash> .

0 votes

Cela m'a permis de tout écraser en un seul commit après une fusion en aval.

21voto

Aaron Points 264

Je sais que cette question ne concerne pas spécifiquement Github, mais puisque Github est largement utilisé et que c'est la réponse que je cherchais, je vais la partager ici.

Github a la possibilité d'effectuer des fusions par écrasement, en fonction des options de fusion activées pour le dépôt.

Si les fusions d'écrasement sont activées, l'option "Ecraser et fusionner" devrait apparaître dans la liste déroulante sous le bouton "Fusionner".

Screenshot of "Squash and merge" Github feature

1 votes

GitHub utilise l'email par défaut associé à votre compte. Si vous avez plusieurs adresses électroniques et que vous devez utiliser une adresse secondaire, vous ne pouvez pas utiliser l'interface utilisateur GH.

1 votes

Très pertinent ! Merci !

4voto

Jool Points 299

Pour écraser votre branche locale avant de la pousser :

  1. prendre en checkout la branche en question pour y travailler si elle n'est pas déjà en checkout.

  2. Trouvez le sha de l'engagement le plus ancien que vous souhaitez conserver.

  3. Créer/checkout une nouvelle branche (tmp1) à partir de ce commit.

    git checkout -b tmp1 <sha1-of-commit>

  4. Fusionner la branche originale dans la nouvelle branche en écrasant.

    git merge --squash <original branch>

  5. Valider les changements qui ont été créés par la fusion, avec un message de validation sommaire.

    git commit -m <msg>

  6. Vérifiez la branche originale que vous voulez écraser.

    git checkout <branch>

  7. Réinitialisez le commit sha original que vous souhaitez conserver.

    git reset --soft <sha1>

  8. Rebasez cette branche sur la nouvelle branche tmp1.

    git rebase tmp1

  9. C'est tout - maintenant, supprimez la branche temporaire tmp1 une fois que vous êtes sûr que tout est correct.

2voto

Pour Git

Créer une nouvelle fonction

via Terminal/Shell :

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

Cela ne l'engage pas, mais vous permet de l'examiner d'abord.

Ensuite, faites un commit, et terminez la fonctionnalité à partir de cette nouvelle branche, et supprimez/ignorez l'ancienne (celle sur laquelle vous avez fait le dev).

0 votes

@Melebius La seule référence à "SourceTree" se trouve dans votre phrase, s'il s'agissait d'un tag ou d'une question précédente : Il n'existe plus.

1 votes

@JordanStefanelli SourceTree a été utilisé dans la version originale de cette réponse . Merci de notifier que c'est corrigé !

2voto

izy Points 413
git checkout YOUR_RELEASE_BRANCH
git pull
git checkout -b A_NEW_BRANCH
git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS
git commit -am "squashing all commits into one"
git push --set-upstream origin A_NEW_BRANCH

1 votes

Merci d'avoir inclus le pull . Toutes les autres réponses semblent supposer que rien n'a changé dans la branche de la version distante depuis la dernière fois que vous y avez traîné.....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X