181 votes

Combinaison de plusieurs commits en un 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.

D'abord, 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?

Deuxièmement, comment puis-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?

176voto

Brian Campbell Points 101107

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 branche topical_xFeature, vous exécutez git rebase -i master. Cela va ouvrir une fenêtre de l'éditeur, avec un ensemble de commits répertoriés préfixé par pick. Vous pouvez modifier tous, mais le premier à l' squash, ce qui permettra d'indiquer à Git de garder tous ces changements, mais la courge dans le premier commit. Après vous avez fait cela, découvrez master et de fusion dans votre branche:

git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature

Alternativement, si vous voulez juste pour écraser tout ce qui en topical_xFeature en master, vous avez juste à faire ce qui suit:

git checkout master
git merge --squash topical_xFeature
git commit

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 en un seul.

87voto

Kondal Kolipaka Points 201

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

ouvrez 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.

choisissez f7f3f6d changé mon nom un peu
choisissez 310154e mis à jour README mise en forme et a ajouté blâmer
choisissez a5f4a0d ajouté chat-fichier

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 le dernier engage des changements. quelque chose comme illustré ci-dessous. Donc, vos 2 dernières validations seront fusionnées avec la première.

choisissez f7f3f6d changé mon nom un peu
squash 310154e mis à jour README mise en forme et a ajouté blâmer
squash a5f4a0d ajouté chat-fichier

pour modifier les "i", il permettra à l'éditeur pour l'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érons que cela va vous aider..

Meilleures Salutations, Kondal Kolipaka

12voto

VonC Points 414372

D'abord: 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 pousser master.
(De cette façon, vous gardez topical_xFeature environ pour les autres évolutions, que vous pouvez enregistrer sur master comme un seul nouveau commit sur la prochaine fusion --no-ff.
Si se débarrasser de l' topical_xFeature est le but, alors git merge --squash est la bonne option, comme détaillé dans Brian Campbell's réponse.)

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