git cherry-pick dit “… 38c74d est une fusion mais aucune option -m n’a été donnée”

J’ai fait quelques changements dans ma twig principale et je veux les amener en amont. quand je sélectionne les commits suivants, je rest bloqué sur fd9f578 où git dit:

$ git cherry-pick fd9f578 fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given. 

Qu’est-ce que git essaie de me dire et est-ce que la sélection des cerises est la bonne chose à utiliser ici? La twig principale inclut les modifications apscopes aux fichiers qui ont été modifiés dans la twig en amont, donc je suis sûr qu’il y aura des conflits de fusion, mais ceux-ci ne seront pas trop graves pour être corrigés. Je sais quels changements sont nécessaires où.

Ce sont les engagements que je veux apporter en amont.

 e7d4cff added some comments... 23e6d2a moved static ssortingngs... 44cc65a incorporated test ... 40b83d5 whoops delete whitspace... 24f8a50 implemented global.c... 43651c3 cleaned up ... 068b2fe cleaned up version.c ... fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common 4172caa cleaned up comments in sessions.c ... 

    La façon dont fonctionne une sélection de cerises consiste à prendre le diff que représente un changeset (la différence entre l’arbre de travail à cet endroit et l’arborescence de travail de son parent) et à l’appliquer à votre twig actuelle.

    Donc, si un commit a deux parents ou plus, il représente également deux diffs ou plus – lequel doit être appliqué?

    Vous essayez de choisir fd9f578 , qui était une fusion avec deux parents. Vous devez donc indiquer à la commande cherry-pick laquelle, contre laquelle le diff doit être calculé, en utilisant l’option -m . Par exemple, git cherry-pick -m 1 fd9f578 pour utiliser parent 1 comme base.

    Je ne peux pas dire avec certitude pour votre situation particulière, mais il est généralement conseillé d’utiliser git merge au lieu de git cherry-pick . Lorsque vous sélectionnez une validation de fusion, elle réduit toutes les modifications apscopes dans le parent que vous n’avez pas spécifié à -m dans celle que vous avez -m . Vous perdez toute leur histoire, et ensemble leurs diffs ensemble. Ton appel.

    La réponse de @Barealid est correcte, mais supposons que vous ne vous souciez pas de préserver l’historique exact de la fusion d’une twig et que vous souhaitiez simplement en choisir une version linéarisée. Voici un moyen simple et sûr de le faire:

    Etat de départ: vous êtes sur la twig X et vous souhaitez sélectionner les commits Y..Z .

    1. git checkout -b tempZ Z
    2. git rebase Y
    3. git checkout -b newX X
    4. git cherry-pick Y..tempZ

    Ce que cela fait est de créer un tempZ twig basé sur Z , mais avec l’historique de Y en linéarisation, puis de le sélectionner sur une copie de X appelée newX . (Il est plus prudent de faire cela sur une nouvelle twig que de muter X ). Bien sûr, il peut y avoir des conflits à l’étape 4, que vous devrez résoudre de la manière habituelle ( cherry-pick fonctionne très bien comme rebase à cet égard) ).

    Si l’étape 2 donne le message “La tempZ de twig actuelle est à jour”, alors Y..Z était déjà linéaire, ignorez donc simplement ce message et passez aux étapes 3 et 4.

    newX ensuite en revue newX et voyez si cela a fait ce que vous vouliez.

    (Remarque: ce n’est pas la même chose qu’un simple git rebase X sur la twig Z , car cela ne dépend en aucune façon de la relation entre X et Y ; il peut y avoir des commits entre l’ancêtre commun et Y t voulez.)

    Voici une réécriture de la réponse acceptée qui clarifie idéalement les avantages / risques des approches possibles:

    Vous essayez de choisir fd9f578, qui était une fusion avec deux parents.

    Au lieu de choisir une fusion, la chose la plus simple est de sélectionner les commits que vous voulez réellement pour chaque twig de la fusion.

    Comme vous avez déjà fusionné, il est probable que tous vos commits souhaités figurent dans votre liste. Choisissez-les directement et vous n’avez pas à vous soucier du commit de fusion.

    explication

    La façon dont fonctionne une sélection de cerises consiste à prendre le diff que représente un ensemble de modifications (la différence entre l’arbre de travail à cet endroit et l’arbre de travail de son parent) et à appliquer l’ensemble de modifications à votre twig actuelle.

    Si une validation a deux parents ou plus, comme c’est le cas avec une fusion, cette validation représente également deux diffs ou plus. L’erreur se produit à cause de l’incertitude sur le diff qui devrait s’appliquer.

    des alternatives

    Si vous déterminez que vous devez inclure les fusions et les sélections associées, vous avez deux options:

    1. (Plus compliqué et plus obscur; élimine également l’histoire), vous pouvez indiquer quel parent devrait s’appliquer.

      • Utilisez l’option -m pour le faire. Par exemple, git cherry-pick -m 1 fd9f578 utilisera comme base le premier parent répertorié dans la fusion.

      • Considérez également que lorsque vous sélectionnez une validation de fusion, elle réduit toutes les modifications apscopes dans le parent que vous n’avez pas spécifié à -m dans celle que vous avez -m . Vous perdez toute leur histoire, et ensemble leurs diffs ensemble. Ton appel.

    2. (Plus simple et plus familier; conserve l’historique), vous pouvez utiliser git merge au lieu de git cherry-pick .

      • Comme d’habitude avec git merge , il tentera d’appliquer tous les commits existant sur la twig que vous fusionnez et de les répertorier individuellement dans votre journal git.

    Simplification de la méthode @Daira Hopwood bonne pour choisir un seul engagement. Pas besoin de succursales temporaires.

    Dans le cas de l’auteur:

    • Z est requirejs commit (fd9f578)
    • Y est engagé avant lui
    • X twig de travail actuelle

    alors fais:

     git checkout Z # move HEAD to wanted commit git reset Y # have Z as changes in working tree git stash # save Z in stash git checkout X # return to working branch git stash pop # apply Z to current branch git commit -a # do commit