Syntaxe de sélection de Git et de fusion de branches

donc j'ai fait d'innombrables choix de cerises avant et il semble que je dois échouer à la vie avec ce droit maintenant, je suis en train d'essayer de choisir de cerises d'une branche à l'autre qui devrait être facile, Comment puis-je obtenir une erreur à ce sujet étant une fusion mais pas-m a été donné?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given.
fatal: cherry-pick failed

qui semble erroné.......il devrait être:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

depuis Quand dois-je fournir une fonction a-m?

51
demandé sur Frank 2012-09-27 21:16:12

5 réponses

vous devez fournir -m si la commit est une merge commit , c'est-à-dire une commit avec plus d'un parent.

Normalement, ce que git cherry-pick REV fait peut être décrit comme:

  1. prendre les changements entre rev et sa mère.

  2. appliquer ces changements à la tête actuelle et engager le résultat avec rev message de commit.

un commit de fusion joint deux lignes de développement. Par exemple, une ligne met en œuvre widget, et l'autre ligne supprime le désordre. La fusion vous donne le code avec le widget, sans l'encombrement.

considérez maintenant l'étape #1 du processus de sélection: git ne peut pas deviner si vous voulez supprimer le désordre ou mettre en œuvre le widget. Et vous ne pouvez faire les deux, parce que l'information sur la façon de faire les deux n'est pas contenu à l'intérieur d'une seule commit de fusion, seul le contenu de l'arbre résultant de la fusion l'est.

l'option -m vous permet de dire à git comment procéder. Par exemple , si la suppression de clutter s'est produite sur master et que la propagation de la fusion a été créée en utilisant git merge WIDGET , alors git cherry-pick -m 1 merged-commit sélectionnera le nouveau widget car la différence entre l'arbre fusionné et le parent 1 (Le Dernier des clutter-removing commits) aura été exactement l'ajout de widget. Sur l'autre main, git cherry-pick -m 2 merge-commit va supprimer le clutter, parce que la différence entre le parent 2 (Le Dernier du widget-ajout commet) et merge-commit est exactement le clutter-suppression manquant de la branche widget .

67
répondu user4815162342 2013-04-17 20:53:41

le git vous demande de spécifier le numéro de parent ( -m ), parce que votre commit de fusion a deux parents et git ne savent pas quel côté de la fusion devrait être considéré comme la ligne principale. Ainsi, en utilisant cette option, vous pouvez spécifier le nombre parent (à partir de 1) de la ligne principale et de la sélection pour rejouer le changement par rapport au parent spécifié.

pour connaître vos parents commit, essayez l'un ou l'autre:

git show --pretty=raw <merge_commit>

ou:

git cat-file -p <merge_commit>

ou même pour une meilleure visibilité, essayez:

gitk <merge_commit>

Comme résultat, vous devriez obtenir quelque chose comme:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>

vérifiez ensuite les détails de chaque parent par:

git show <parent1_or_2_commit>

Ajouter --stat pour voir la liste des fichiers modifiés.

Ou utilisez la commande suivante pour comparer les changements (basé sur le ci-dessus parent):

git diff <parent1_or_2_commit>..<commit>

Ajouter --stat pour voir la liste des fichiers modifiés.

ou utilisez la diff combinée pour comparer les deux parents par:

git diff --cc <parent1_commit>
git diff --cc <parent2_commit>

spécifiez ensuite le numéro parent à partir de 1 pour votre choix, par exemple

git cherry-pick -m 1 <merge_commit>

puis git status pour voir ce qui se passe. Si vous ne voulez pas encore propager les modifications, ajoutez -n l'option pour voir ce qui se passe. Puis quand vous n'êtes pas heureux, réinitialisez à la tête ( git reset HEAD --hard ). Si vous obtenez des conflits git, vous devrez probablement les résoudre manuellement ou spécifier la stratégie de fusion ( -X ), voir: comment résoudre les conflits de fusion dans Git?

14
répondu kenorb 2017-05-23 10:31:31

personnellement ce que je fais normalement c'est que depuis une fusion combine 2 commits, par exemple si j'ai merge commit C qui est composé de 2 parents E. g commit a dans master et commit B de l'autre branche se fusionner, si je dois choisir la Fusion, Je ne m'embêterais pas avec la commande confuse de choisir la fusion, mais au lieu de cela je choisirais juste cherry chacun des parents a et B individuellement, ce qui est également utile dans une situation où vous voulez seulement choisir cherry commit B seulement dans le cas où commit a de master a déjà été choisi à la branche on est en train de le faire avant la fusion.

3
répondu Wyclif 2016-01-20 16:48:42

la syntaxe des pages de manuel est la suivante:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...

le numéro parent se réfère à:

-m parent-nombre, --mainline parent-nombre, Généralement vous ne pouvez pas choisir une fusion parce que vous ne savez pas de quel côté de la fusion doit être considéré comme la voie principale. Cette option spécifie le nombre parent (à partir de 1) de la ligne principale et permet à cherry-pick de rejouer le changement par rapport au parent spécifié.

donc je revérifierais pour m'assurer que vous avez le bon hash de propagation. Il pourrait être que vous voulez un qui n'est pas d'une fusion, mais la validation avant. Sinon, vous devez utiliser ce drapeau et pointer vers le bon côté de la fusion pour désambiguer votre demande.

2
répondu Magikhead 2012-09-27 17:45:28

essayer de fusionner le résultat:

git cherry-pick ....
git mergetool
git cherry-pick --continue
0
répondu Knase 2016-07-30 18:36:43