git - sauter spécifiques s'engage lors de la fusion
J'ai été en utilisant Git pour environ un an maintenant et pense que c'est fantastique, mais je viens juste de commencer sur une deuxième version du projet et a commencé une nouvelle branche pour elle. Je me bats un peu avec la meilleure façon de traiter les choses à l'avenir.
J'ai deux branches appelé à dire master10 (v1) et master20 (pour la v2). J'ai été faire des corrections de bugs de la v1 sur la branche master10, et le développement de nouveaux trucs de master20. Chaque fois que je fais une correction de bug-je les fusionner en v2 en vérifiant master20 et de faire git merge master10
. So far So good.
Maintenant, cependant, j'ai fait un changement dans la v1 que je ne veux pas dans la v2, mais je veux continuer à fusionner d'autres corrections de bugs. Comment dois-je dire à Git d'ignorer ce commit (ou une série de commits), mais qu'à l'avenir, j'ai encore envie de fusionner d'autres corrections de bugs.
J'ai pensé git rebase
peut-être ce que j'ai besoin de lire la doc et ma tête a explosé près.
Je pense ce que je veux, c'est quelque chose comme un "git de synchronisation de la commande" qui indique à git que les deux branches sont maintenant synchro et à l'avenir, seulement fusionner les commits de cette synchronisation-point.
Toute aide appréciée.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez fusionner les la plupart, mais pas tous les commits de la branche "maint" à "maître", par exemple, vous pouvez le faire. Cela nécessite un peu de travail---- comme mentionné ci-dessus, l'habitude de cas d'utilisation est de fusionner le tout à partir d'une branche--- mais parfois, il arrive que vous faites un changement à une version qui ne devrait pas être intégré à l'arrière (peut-être que le code a été remplacé en master déjà), alors comment faites-vous représenter? Voilà...
Donc, supposons que maint a eu 5 modifications appliquées, et l'un de ceux (maint~3) est de ne pas être fusionnée dans le maître, bien que tous les autres devraient l'être. Vous faites cela en trois étapes: fusionner le tout avant que l'un, dire à git pour marquer maint~3 comme fusionné même quand il ne l'est pas, et puis de fusionner le reste. La magie est:
La première commande fusionne tout avant votre gênants maint s'engager sur master. La valeur par défaut de fusion du journal de message d'expliquer que vous êtes à la fusion de "branche " maint' (première partie)".
La deuxième commande fusionne le gênants maint~3 commettre, mais le "-s nôtre" option indique à git d'une "fusion" de stratégie qui, en fait, fonctionne simplement en gardant l'arborescence vous se fusionnent et en ignorant le commit(s) vous êtes fusionner complètement. Mais il ne encore de faire une nouvelle fusion s'engager avec la TÊTE et maint~3 en tant que parents, de sorte que le graphe de révision dit maintenant que maint~3 est fusionné. Donc, en fait, vous devriez utiliser l'option-m de 'git merge", d'expliquer que maint~3 commettre est en fait d'être ignoré!
La commande finale fusionne simplement le reste de maint (maint~2..maint) en master de sorte que vous êtes tous synchronisés de nouveau.
À mon humble avis, la chose la plus logique à faire, c'est à fusionner tout, et puis l'utilisation de git revert (commit_you_dont_want) pour le supprimer.
Exemple:
Si vous avez plusieurs "à ignorer" s'engage, ou à modifier revenir message:
Alors votre histoire pourrait ressembler à:
Si vous avez des conflits impliquant SEULEMENT ces "à-ignorer" s'engage, vous pouvez utiliser:
De sorte que votre version persisteront sur l'autre. Même sans les messages d'erreur, vous pouvez toujours "revenir" ces indésirables s'engage, parce qu'ils peuvent avoir d'autres changements qui ne sont pas en conflit, et vous ne voulez pas.
Si vous avez des conflits il englobe NON SEULEMENT la "ignorer" s'engage, vous devez les résoudre manuellement, et vous aurez probablement à résoudre lors du retour.
S'engage inclure l'ascendance. Vous ne pouvez pas fusionner un commit sans fusion préalable s'engage.
Vous pouvez choisir entre eux, bien sûr. C'est une amende de débit lorsque vous avez une branche qui est en mode de maintenance.
Sonne comme un cas classique pour git cherry-pick'
https://git-scm.com/docs/git-cherry-pick
c'est exactement ce que cela ressemble
Une sorte de publicité à mon projet qui, fondamentalement, enveloppe le processus décrit par @araqnid.
C'est une sorte d'assistant qui introduit la suite GIT flow:
Une citation de la page du projet:
D'en créer une troisième branche pour les changements que vous voulez dans master10 mais pas dans master20. Toujours considérer master10 comme votre "maître", le plus stable de la branche de tous. La direction de toutes les autres branches souhaitez conserver la synchronisation à tout moment.
Plutôt que
revert
oucherry-pick
pour ce cas, vous avez besoin pour obtenir git pour examiner les changements que vous êtes ignorant à être plus âgés que ceux que vous faites.Donc:
git merge ccc
git merge fff --no-commit
git merge --continue
git merge source-branch-head
Après l'Étape 4, git va tenir compte de votre branche plus récente que celle qui s'engagent, puisque vous avez fait affaire avec elle (par le choix de garder VOS versions de choses).