Cette question concerne non seulement comment accomplir cette tâche, mais aussi si cela est une bonne ou une mauvaise pratique avec Git.
Considérez que localement, je travaille principalement sur la branche master, mais j'ai créé une branche topique que j'appellerai "topical_xFeature". En train de travailler sur "topical_xFeature" et de basculer dans les deux sens pour effectuer d'autres travaux sur la branche master, il s'avère que j'ai fait plus d'un commit sur la branche "topical_xFeature", mais entre chaque commit, je n'ai pas fait pousser.
Tout d'abord , considérez-vous cette mauvaise pratique? Ne serait-il pas plus sage de s'en tenir à un commit par branche et par push? Dans quels cas serait-il bon d'avoir plusieurs commits sur une branche avant qu'une poussée ne soit faite?
Deuxièmement , comment dois-je effectuer au mieux pour amener les multiples commits de la branche topical_xFeature dans la branche master pour un push? Est-ce gênant de ne pas s'en inquiéter et de simplement faire le push où plusieurs commits sont poussés, ou est-il moins ennuyeux de fusionner les commits en un seul puis de pousser? Encore une fois, comment faire cela?
la source
git branch -d topic
. Pourquoi git n'est-il pas capable d'identifier que toutes les modifications sont fusionnées?git branch -D topic
pour la supprimer de force.C'est la façon dont je suis généralement de combiner plusieurs Commits en un seul commit avant de pousser le code.
Pour y parvenir, je vous suggère d'utiliser le concept de « squash » fourni par GIT.
Suivez les étapes ci-dessous.
1) git rebase -i master (au lieu de master, vous pouvez également utiliser un commit spécifique)
ouvrez l'éditeur interactif rebase, où il affichera tous vos commits. Fondamentalement, où vous devez identifier les commits que vous souhaitez fusionner en un seul commit.
Imaginez que ce sont vos commits et que vous montriez quelque chose comme ça dans l'éditeur.
Il est important de noter que ces validations sont répertoriées dans l'ordre opposé à celui que vous voyez normalement à l'aide de la commande log. Cela signifie que l'ancien commit sera affiché en premier.
2) Remplacez «pick» par «squash» pour les dernières modifications validées. quelque chose comme indiqué ci-dessous. Ce faisant, vos 2 derniers commits seront fusionnés avec le premier.
Vous pouvez également utiliser une forme courte si vous avez beaucoup de commits à combiner:
pour l'édition, utilisez «i», cela activera l'éditeur pour l'insertion. Gardez à l'esprit que la plupart des commit (les plus anciens) ne peuvent pas être écrasés car il n'y a pas de commit précédent à combiner. Il faut donc le choisir ou «p». Utilisez 'Echap' pour quitter le mode insertion.
3) Maintenant, enregistrez l'éditeur avec la commande suivante. : wq
Lorsque vous enregistrez cela, vous avez un seul commit qui introduit les modifications des trois commits précédents.
J'espère que ceci vous aidera.
la source
git rebase -i HEAD~2
était un endroit utile pour moi pour commencer. Ensuite, cette réponse a été utile. Ensuite, mon agit status
montré "Votre branche et 'origine / fonctionnalité / xyz' ont divergé, et ont respectivement 1 et 1 commits différents." J'avais donc besoin degit push origin feature/xyz --force-with-lease
voir stackoverflow.com/a/59309553/470749 et freecodecamp.org/forum/tPremièrement : rien ne vous dit de n'avoir qu'un seul commit par branche et par push: un push est un mécanisme de publication vous permettant de publier un historique local (c'est-à-dire une collection de commits) sur un repo distant.
Deuxièmement : un
git merge --no-ff topical_xFeature
enregistrement sur master comme un seul commit de votre travail de sujet, avant de poussermaster
.(De cette façon, vous restez
topical_xFeature
dans les parages pour d'autres évolutions, que vous pouvez enregistrer enmaster
tant que nouveau commit unique lors de la prochaine fusion - no-ff.Si se débarrasser
topical_xFeature
est l'objectif, alorsgit merge --squash
est la bonne option, comme détaillé dans Brian Campbell de » réponse .)la source
--squash
pas--no-ff
ce que tu veux.--no-ff
créerait un commit de fusion, mais laisserait également tous les commits detopical_xFeature
.topical_feature
branche autour, et juste enregistrer un seul commit sur lamaster
branche.Passez à la branche principale et assurez-vous que vous êtes à jour.
git fetch
cela peut être nécessaire (en fonction de votre configuration git) pour recevoir des mises à jour sur origin / masterFusionnez la branche de fonctionnalité dans la branche principale.
Réinitialisez la branche principale à l'état d'origine.
Git considère désormais toutes les modifications comme des modifications non organisées. Nous pouvons ajouter ces modifications en un seul commit. Ajouter . ajoutera également des fichiers non suivis.
Réf: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
la source
Choisissez d'abord le commit après lequel vous voulez que tout vienne.
Réinitialiser à votre tête sélectionnée (j'ai choisi
HEAD@{2}
)git status
(juste pour être sûr)Ajoutez votre nouveau commit
Remarque:
HEAD@{0}
&HEAD@{1}
Sont maintenant fusionnés en 1 commit, cela peut également être fait pour plusieurs commits.git reflog
à nouveau devrait afficher:la source
Un outil pour automatiser plusieurs commits en un seul
comme le dit Kondal Kolipaka . Utilisation de "git rebase -i"
La logique de "git rebase"
Lorsque vous utilisez "git rebase -i", git génère le fichier git-rebase-todo dans le répertoire actuel .git / rebase-merge, puis appelle l'éditeur git pour permettre aux utilisateurs de modifier le fichier git-rebase-todo pour le traitement. L'outil doit donc répondre:
Modifier l'éditeur git par défaut
Donc, l'outil doit changer l'éditeur git et traiter le fichier git-rebase-todo. L'outil utilisant python ci-dessous:
Réf: https://liwugang.github.io/2019/12/30/git_commits_en.html
la source