En ce qui concerne une gamme de commits, la sélection des cerises est n'était pas pratique.
Comme mentionné ci-dessous par Keith Kim , Git 1.7.2+ a introduit la possibilité de sélectionner une gamme de validations (mais vous devez toujours être conscient des conséquences de la sélection à la cerise pour une fusion future )
git cherry-pick "a appris à choisir une gamme de commits
(par exemple" cherry-pick A..B
"et" cherry-pick --stdin
")," git revert
"; ils ne supportent pas le meilleur contrôle de séquençage" rebase [-i]
".
damian commente et nous prévient:
Dans le cherry-pick A..B
formulaire " ", A
doit être plus ancien queB
.
S'ils sont du mauvais ordre, la commande échouera silencieusement .
Si vous voulez choisir la plage à B
travers D
( y compris) ce serait B^..D
.
Voir " Git create branch from range of previous commits? " Comme illustration.
Comme le mentionne Jubobs dans les commentaires :
Cela suppose que ce B
n'est pas un commit racine; unknown revision
sinon, vous obtiendrez une erreur " ".
Remarque: à partir de Git 2.9.x / 2.10 (Q3 2016), vous pouvez sélectionner une plage de commit directement sur une branche orpheline (tête vide): voir " Comment faire d'une branche existante orpheline dans git ".
Réponse originale (janvier 2010)
Un rebase --onto
serait mieux, où vous rejouez la plage de validation donnée au-dessus de votre branche d'intégration, comme Charles Bailey l'a décrit ici .
(recherchez également "Voici comment vous transplanteriez une branche de sujet basée sur une branche à une autre" dans la page de manuel de git rebase , pour voir un exemple pratique de git rebase --onto
)
Si votre branche actuelle est l'intégration:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Cela rejouera tout entre:
- après le parent de
first_SHA-1_of_working_branch_range
(d'où le ~1
): le premier commit que vous souhaitez rejouer
- jusqu'à "
integration
" (qui pointe vers le dernier commit que vous souhaitez rejouer, depuis la working
branche)
à " tmp
" (qui indique où integration
pointait auparavant)
En cas de conflit lors de la relecture de l'un de ces validations:
- soit le résoudre et exécuter "
git rebase --continue
".
- ou ignorer ce correctif et exécuter à la place "
git rebase --skip
"
- ou annuler le tout avec un "
git rebase --abort
" (et remettre la integration
branche sur la tmp
branche)
Après cela rebase --onto
, integration
sera de retour au dernier commit de la branche d'intégration (c'est-à-dire " tmp
" branche + tous les commits rejoués)
Avec la cueillette des cerises ou rebase --onto
, n'oubliez pas que cela a des conséquences sur les fusions ultérieures, comme décrit ici .
Une cherry-pick
solution " " pure est discutée ici et impliquerait quelque chose comme:
Si vous souhaitez utiliser une approche par patch, "git format-patch | git am" et "git cherry" sont vos options.
À l' heure actuelle, git cherry-pick
accepte un seul commit, mais si vous voulez choisir la plage B
par D
ce serait B^..D
dans git Lingo, donc
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Mais de toute façon, lorsque vous devez "rejouer" une série de validations, le mot "rejouer" devrait vous pousser à utiliser la fonctionnalité " rebase
" de Git.