La Combinaison De Plusieurs Engage Dans Une Avant De Pousser
Cette question ne concernent pas seulement la façon d'accomplir cette tâche, mais si cela est une bonne ou une mauvaise pratique avec Git.
Considérer que, localement, je fais la plupart du travail sur la branche master, mais j'ai créé un topique branche je vais appeler "topical_xFeature". Dans le processus de travail sur "topical_xFeature" et des allers-retours pour faire d'autres travaux sur la branche master, il s'avère que j'ai fait plus d'un commit sur la "topical_xFeature" de la branche, mais entre chaque commit, je n'ai pas fait de pousser.
Première, envisagez-vous de cette mauvaise pratique? Ne serait-il pas plus sage de rester avec un commit par direction par poussée? Dans ce cas, serait-il bon d'avoir plusieurs s'engage sur une branche avant de pousser un est fait?
Deuxième, comment vais-je accomplir apportant les multiples s'engage sur la topical_xFeature branche dans la branche master pour un coup de pouce? Est une nuisance pour vous inquiétez pas à ce sujet et juste de faire du push où plusieurs s'engage obtenir poussé, ou qu'il est moins gênant de faire en quelque sorte fusionner les commits dans un et ensuite de pousser? Encore une fois, comment faire?
Vous devez vous connecter pour publier un commentaire.
Pour votre première question, non, il n'y a rien de mal à pousser plusieurs engage à la fois. De nombreuses fois, vous pouvez les diviser votre travail vers le bas dans un peu de petite taille s'engage, mais seulement de les pousser vers le haut une fois vous vous sentez comme l'ensemble de la série est prêt. Ou vous pourriez faire quelques engage localement tout en étant déconnecté, et vous poussent tous une fois que vous êtes connecté à nouveau. Il n'y a pas de raison de se limiter à un commit à chaque pression.
En général, je trouve que c'est une bonne idée de garder chaque commit un seul, logique, cohérente changement, qui comprend tout ce dont il a besoin pour travailler (donc, il ne laisse pas votre code dans un état rompu). Si vous avez un deux commits, mais ils ne provoquer le code pour être cassé, si vous en seulement appliqué la première, il pourrait être une bonne idée de supprimer le deuxième s'engager dans la première. Mais si vous avez deux commits où chacun fait un changement raisonnable, poussant comme des livraisons séparées est très bien.
Si vous ne voulez squash plusieurs commits ensemble, vous pouvez utiliser
git rebase -i
. Si vous êtes sur la branchetopical_xFeature
, vous devez exécutergit rebase -i master
. Cela va ouvrir une fenêtre de l'éditeur, avec un ensemble de commits répertoriés préfixé parpick
. Vous pouvez modifier tous, mais le premier àsquash
, qui va indiquer à Git de garder tous ces changements, mais la courge dans le premier commit. Après vous avez fait cela, découvrezmaster
et de fusion dans votre branche:Alternativement, si vous voulez juste de squash tout en
topical_xFeature
enmaster
, vous avez juste à faire ce qui suit:Celui que vous choisissez est à vous. En général, je ne voudrais pas vous soucier d'avoir plusieurs petits commits, mais parfois vous ne voulez pas vous embêter avec extra mineur commet, il vous suffit de les écraser dans un.
git merge --squash
! la droite. +1git branch -d topic
. Pourquoi est-git pas en mesure d'identifier que tous les changements sont fusionnées?git branch -D topic
à force de le supprimer.C'est la façon dont je le suivent généralement de combiner plusieurs s'Engage dans un seul s'engager avant que j'appuie sur le code.
Pour y parvenir, je vous suggère d'utiliser 'squash' concept fourni par GIT.
Suivez les étapes ci-dessous.
1) git rebase -i master (au lieu de maître vous pouvez également utiliser un spécifique commettre)
ouvrir le rebase interactif de l'éditeur, où il montrera tous vos commits. Fondamentalement, lorsque vous avez besoin d'identifier les commits qui vous souhaitez fusionner dans un seul commit.
Imaginez ce sont vos commits et montré quelque chose comme cela dans l'éditeur.
Il est important de noter que ces révisions sont répertoriés dans l'ordre opposé à celui que vous voyez normalement entre eux à l'aide de la commande log. Les moyens, les plus âgés commit sera affiché en premier.
2) Changement de 'choix' pour 'squash' pour la dernière commis des changements. quelque chose comme illustré ci-dessous. Donc, vos 2 dernières validations seront fusionnées avec la première.
Vous pouvez également utiliser la forme courte si vous avez beaucoup de engage à combiner:
pour l'édition utilisez "je", il permettra à l'éditeur pour l'insertion. Gardez à l'esprit tout en haut(les plus anciennes) s'engager à ne peut pas être écrasé comme il n'y a pas de précédent s'engager à combiner avec. Donc, il doit être repris ou 'p'. Utiliser " Esc " pour quitter le mode insertion.
3) Maintenant, économiser de l'éditeur avec la commande suivante.
:wq
Lorsque vous enregistrez, vous avez un seul commit qui introduit les modifications de tous les trois précédentes s'engage.
Espère que cela va vous aider.
Première: rien ne vous dit qu'un commit par branche par push: une poussée est une publication mécanisme vous permettant de publier une histoire locale (c'est à dire une collection de commits) sur une distance de repo.
Deuxième: un
git merge --no-ff topical_xFeature
serait d'enregistrer sur le maître comme un seul commit votre sujet de travail, avant de poussermaster
.(De cette façon, vous gardez
topical_xFeature
autour pour d'autres évolutions, que vous pouvez enregistrer surmaster
comme un seul nouveau commit sur la prochaine fusion --no-ff.Si se débarrasser de
topical_xFeature
est le but, alorsgit merge --squash
est la bonne option, comme détaillé dans Brian Campbell's réponse.)--squash
, pas--no-ff
est ce que vous voulez.--no-ff
serait de créer un commit de fusion, mais aussi de laisser tous les commits detopical_xFeature
.topical_feature
direction, et il vous suffit d'enregistrer un seul commit surmaster
branche.Passer à la branche master et assurez-vous que vous êtes à jour.
git fetch
ce sera peut-être nécessaire (en fonction de votre git config) pour recevoir des mises à jour sur origin/masterDe fusion de la branche dans la branche master.
Réinitialiser la branche master à l'origine de l'état.
Git considère désormais toutes les modifications que unstaged changements.
Nous pouvons ajouter à ces changements comme un commit.
L'ajout d' . également ajouter sans traces de fichiers.
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
1) d'Abord choisir les commit que vous voulez que tout est venu après.
2) Réinitialisation de votre choix sur la tête (j'ai choisi la TÊTE de@{2})
3) git status (juste pour être sûr)
4) Ajouter votre nouveau commit
Remarque:
HEAD@{0}
&HEAD@{1}
Sont maintenant fusionnés en 1 s'engager, ce qui peut être fait pour de multiples s'engage également.git reflog à nouveau s'afficher: