Question Comment sélectionner plusieurs commits


J'ai deux branches. Commettre a est la tête d'un, tandis que l'autre a b, c, d, e et f au dessus de a. Je veux bouger c, d, e et f à la première branche sans commettre b. Utilisation de cerise ramasser c'est facile: commander la première branche cerise-cueillir un par un c à f et rebase la deuxième branche sur la première. Mais est-il possible de choisir tous c-f en une commande?

Voici une description visuelle du scénario (merci JJD):

enter image description here


560
2017-11-04 00:07


origine


Réponses:


Git 1.7.2 a introduit la possibilité de sélectionner une gamme de commits. Du notes de version:

git cherry-pick "a appris à choisir une gamme de commits   (par exemple "Cherry-pick A..B" et "cherry-pick --stdin"), tout comme "git   revenir ", ceux-ci ne prennent pas en charge le contrôle de séquençage plus agréable" rebase   [-i] "a, cependant.


Y compris les commentaires importants (crédits aux auteurs respectifs)

Note 1: Dans le formulaire "Cherry-pick A..B", A doit être plus ancien que B. Si elles sont dans le mauvais ordre, la commande échouera silencieusement. - Damian

Note 2: En outre, cela ne cueillera pas A, mais plutôt tout après A jusqu'à B. B. J. Rainsberger

Note 3: Pour inclure A juste taper git cherry-pick A ^ .. B - sschaef


817
2017-10-14 13:08



Le moyen le plus simple de le faire est de onto option à rebase. Supposons que la branche dont le courant se termine à a est appelé mybranch et c'est la branche que vous voulez déplacer c-f sur.

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b

84
2017-11-04 08:13



Ou le one-liner demandé:

git rebase --onto a b f

70
2018-05-25 15:12



Vous pouvez utiliser une combinaison en série de git rebase et git branch appliquer un groupe de validations sur une autre branche. Comme déjà Envoyé par wolfc la première commande copie réellement les commits. Toutefois, la modification n'est pas visible jusqu'à ce que vous ajoutez un nom de branche à la plus haute validation du groupe.

S'il vous plaît ouvrir l'image dans un nouvel onglet ...

Workflow

Pour résumer les commandes au format texte:

  1. Ouvrir gitk en tant que processus indépendant utilisant la commande: gitk --all &.
  2. Courir git rebase --onto a b f.
  3. presse F5 dans gitk. Rien ne change. Mais non HEAD est marqué.
  4. Courir git branch selection
  5. presse F5 dans gitk. La nouvelle branche avec ses validations apparaît.

Cela devrait clarifier les choses:

  • Commettre a est la nouvelle destination racine du groupe.
  • Commettre b est le commit avant la première validation du groupe (exclusif).
  • Commettre f est le dernier commit du groupe (inclus).

Ensuite, vous pourriez utiliser git checkout feature && git reset --hard b pour supprimer les validations c jusqu'à f du feature branche.

En plus de cette réponse, j'ai écrit un article de blog qui décrit les commandes dans un autre scénario qui devrait aider à l'utiliser généralement.


49
2017-09-28 20:30



Appliquer les commentaires de J. B. Rainsberger et de sschaef pour répondre spécifiquement à la question ... Pour utiliser une gamme de choix de cerises sur cet exemple:

git checkout a
git cherry-pick b..f

ou

git checkout a
git cherry-pick c^..f

19
2017-07-26 18:25



git rev-list --reverse b..f | xargs -n 1 git cherry-pick

18
2017-11-04 03:59



git format-patch --full-index --binary --stdout range... | git am -3

4
2017-11-04 01:08