Lorsqu'il s'agit d'une série de commits, le choix de l'un d'entre eux est était pas pratique.
Comme mentionnés ci-dessous par Keith Kim Git 1.7.2+ a introduit la possibilité d'extraire une série de commits (mais vous devez toujours être conscient de l'existence de l'option d'extraire des commits). les conséquences de la sélection pour les fusions futures )
git cherry-pick" appris à choisir une gamme de commits
(par exemple, " cherry-pick A..B
" et " cherry-pick --stdin
"), tout comme " git revert
"Ces derniers ne supportent pas la commande de séquençage plus agréable " rebase [-i]
" l'a fait, cependant.
damian commentaires et nous met en garde :
Dans le " cherry-pick A..B
", A
doit être plus ancienne que B
.
S'ils sont dans le mauvais ordre, la commande échouera silencieusement. .
Si vous voulez choisir le gamme B
par le biais de D
(y compris B
) qui serait B^..D
(au lieu de B..D
).
Voir " Git crée une branche à partir d'une série de commits précédents ? " à titre d'illustration.
Comme Jubobs mentionne dans les commentaires :
Cela suppose que B
n'est pas un commit Root ; vous obtiendrez un " unknown revision
Sinon, erreur ".
Note : à partir de Git 2.9.x/2.10 (Q3 2016), vous pouvez choisir une gamme de commit directement sur une branche orpheline (tête vide) : voir " Comment rendre une branche existante orpheline dans git ? ".
Réponse originale (janvier 2010)
A rebase --onto
serait mieux, où vous rejouez la gamme donnée de commit sur votre branche d'intégration, comme Charles Bailey décrit ici .
(recherchez également "Voici comment vous transplanteriez une branche de sujet basée sur une branche vers une autre" dans le document 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 ce qui se trouve entre les deux :
- après le parent de
first_SHA-1_of_working_branch_range
(d'où le ~1
) : le premier commit que vous voulez rejouer
- jusqu'à "
integration
"(qui pointe vers la dernière commande que vous voulez rejouer, à partir de la page d'accueil de l'application working
branche)
à " tmp
"(qui indique l'endroit où integration
pointait avant)
S'il y a un conflit lorsque l'un de ces commits est rejoué :
- soit le résoudre et exécuter "
git rebase --continue
".
- ou ignorez ce patch, et exécutez plutôt "
git rebase --skip
"
- ou annuler le tout avec un "
git rebase --abort
"(et remettre le integration
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 le "cherry-picking" ou rebase --onto
n'oubliez pas qu'elle a des conséquences sur les fusions ultérieures, comme le montre le tableau ci-dessous. décrit ici .
Un pur " cherry-pick
"La solution est discuté ici et il s'agirait de quelque chose comme :
Si vous souhaitez utiliser une approche par patch, "git format-patch|git am" et "git cherry" sont vos options.
Actuellement, git cherry-pick
n'accepte qu'un seul commit, mais si vous voulez choisir l'intervalle B
par le biais de D
qui serait B^..D
en jargon git, donc
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Mais quoi qu'il en soit, lorsque vous avez besoin de "rejouer" une série de commits, le mot "rejouer" devrait vous pousser à utiliser l'option ". rebase
"de Git.
1 votes
draconianoverlord.com/2013/09/07/no-cherry-picking.html (pas mon blog)
2 votes
Le TLDR ; est :
git cherry-pick <one-sha-before-the-oldest-sha-to-pick>..<sha-of-latest-to-pick>