Que signifie Squashing commits dans git. Comment squash commits dans Github?
Je suis nouveau sur Git et j'ai demandé à être affecté à un nouveau bogue dans coala-analyzer. J'ai corrigé le bug, et maintenant on m'a demandé d'écraser mes commits. Comment fait-on ça?
Réponses:
Vous pouvez considérer Git comme une base de données avancée d'instantanés de votre (vos) répertoire (s) de travail.
Une fonctionnalité très intéressante de Git est la possibilité de réécrire l'historique des commits.
La raison principale pour cela est qu'une grande partie de cette histoire n'est pertinente que pour le développeur qui l'a générée, elle doit donc être simplifiée, ou rendue plus agréable, avant de la soumettre à un référentiel partagé.
Écraser un commit signifie, d'un point de vue idiomatique, déplacer les changements introduits dans ledit commit dans son parent afin que vous vous retrouviez avec un commit au lieu de deux (ou plus).
Si vous répétez ce processus plusieurs fois, vous pouvez réduire n commit à un seul.
Visuellement, si vous avez commencé votre travail au commit marqué Start , vous voulez ceci
Vous remarquerez peut-être que le nouveau commit a une nuance de bleu légèrement plus foncée. C'est intentionnel.
Dans Git, l'écrasement est réalisé avec une Rebase , d'une forme spéciale appelée Interactive Rebase .
En simplifiant lorsque vous rebasez un ensemble de commits dans une branche B , vous appliquez toutes les modifications introduites par ces commits comme elles ont été effectuées, en commençant par B au lieu de leur ancêtre d'origine.
Un indice visuel
Notez à nouveau les différentes nuances de bleu.
Un rebase interactif vous permet de choisir comment les commits doivent être rebasés. Si vous exécutez cette commande:
Vous vous retrouveriez avec un fichier qui répertorie les commits qui seront rebasés
Je n'ai pas nommé les commits, mais ces quatre sont destinés à être les commits du début à la tête
La bonne chose à propos de cette liste est qu'elle est modifiable .
Vous pouvez omettre les validations ou les écraser .
Tout ce que vous avez à faire est de changer le premier mot en squash .
Si vous fermez l'éditeur et qu'aucun conflit de fusion n'est trouvé, vous vous retrouvez avec cet historique:
Dans votre cas, vous ne voulez pas rebaser dans une autre branche, mais plutôt dans un commit précédent.
Afin de transformer l'historique comme indiqué dans le tout premier exemple, vous devez exécuter quelque chose comme
changez les "commandes" en squash pour tous les commits sauf le premier, puis fermez votre éditeur.
Remarque sur la modification de l'historique
Dans Git, les commits ne sont jamais modifiés. Ils peuvent être élagués, rendus inaccessibles, clonés mais pas modifiés.
Lorsque vous rebase, vous créez en fait de nouveaux commits.
Les anciens ne sont plus joignables par aucune référence, ils ne sont donc pas affichés dans l'historique mais ils sont toujours là!
Voici ce que vous obtenez réellement pour un rebase:
Si vous les avez déjà poussés quelque part, réécrire l'historique fera en fait une branche!
la source
man git rebase
: Le message de commit suggéré pour le commit plié est la concaténation des messages de commit du premier commit et de ceux avec la commande "squash"git diff
peut vous aider à montrer ce qui s'est passé.La commande rebase a des options impressionnantes disponibles dans son
--interactive
(ou-i
) mode, et l'une des plus largement utilisées est la possibilité d'écraser les commits. Cela permet de prendre des commits plus petits et de les combiner en plus grands, ce qui pourrait être utile si vous terminez la journée de travail ou si vous souhaitez simplement regrouper vos modifications différemment. Nous allons voir comment vous pouvez le faire facilement.Un mot d'avertissement: ne faites cela que sur les commits qui n'ont pas été poussés dans un référentiel externe. Si d'autres ont basé le travail sur les commits que vous allez supprimer, de nombreux conflits peuvent survenir. Ne réécrivez pas votre historique s'il a été partagé avec d'autres.
Disons que vous venez de faire quelques petits commits et que vous voulez en faire un plus grand. L'historique de notre référentiel ressemble actuellement à ceci:
Les 4 derniers commits seraient beaucoup plus heureux s'ils étaient regroupés, alors faisons simplement cela grâce au rebasage interactif:
Donc, quelques choses se sont produites ici. Tout d'abord, j'ai dit à Git que je voulais rebase en utilisant les quatre derniers commits d'où HEAD est avec HEAD ~ 4. Git m'a maintenant mis dans un éditeur avec le texte ci-dessus, et une petite explication de ce qui peut être fait. Vous avez beaucoup d'options à votre disposition à partir de cet écran, mais pour le moment, nous allons simplement tout écraser en un seul commit. Donc, changer les quatre premières lignes du fichier en ceci fera l'affaire:
Fondamentalement, cela indique à Git de combiner les quatre commits dans le premier commit de la liste. Une fois que cela est fait et enregistré, un autre éditeur apparaît avec ce qui suit:
Puisque nous combinons autant de commits, Git vous permet de modifier le message du nouveau commit en fonction du reste des commits impliqués dans le processus. Modifiez le message comme bon vous semble, puis enregistrez et quittez. Une fois que cela est fait, vos commits ont été écrasés avec succès!
Et si nous regardons à nouveau l'histoire…
Donc, cela a été relativement indolore jusqu'à présent. Si vous rencontrez des conflits pendant le rebase, ils sont généralement assez faciles à résoudre et Git vous guide le plus possible. L'essentiel est de résoudre le conflit en question,
git add
le fichier, puis degit rebase --continue
reprendre le processus. Bien sûr, faire ungit rebase --abort
vous ramènera à votre état antérieur si vous le souhaitez. Si pour une raison quelconque vous avez perdu un commit dans le rebase, vous pouvez utiliser le reflog pour le récupérer.Les détails peuvent être trouvés sur ce lien .
la source
Cela signifie combiner plusieurs commits en un seul. Jettes un coup d'oeil à :
https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/
Écraser mes derniers X commits ensemble en utilisant Git
la source