Quando se trata de uma variedade de confirmações, a escolha da cereja é não foi prático.
Conforme mencionado abaixo por Keith Kim , o Git 1.7.2+ introduziu a capacidade de escolher uma variedade de confirmações (mas você ainda precisa estar ciente das conseqüências da escolha da cereja para mesclagem futura )
O git cherry-pick "aprendeu a escolher uma variedade de confirmações
(por exemplo," cherry-pick A..B
"e" cherry-pick --stdin
"), o mesmo fez" git revert
"; no entanto , elas não suportam o melhor controle de seqüenciamento" rebase [-i]
.
damian comenta e nos adverte:
No cherry-pick A..B
formulário " ", A
deve ter mais deB
.
Se eles estiverem na ordem errada, o comando falhará silenciosamente .
Se você quer escolher a gama B
através de D
(inclusive) que seria B^..D
.
Consulte " Git create branch a partir do intervalo de confirmações anteriores? " Como uma ilustração.
Como Jubobs menciona nos comentários :
Isso pressupõe que B
não é um commit raiz; você receberá um unknown revision
erro " " caso contrário.
Nota: a partir do Git 2.9.x / 2.10 (terceiro trimestre de 2016), você pode escolher um intervalo de confirmação diretamente em um ramo órfão (cabeça vazia): consulte " Como tornar um ramo existente um órfão no git ".
Resposta original (janeiro de 2010)
A rebase --onto
seria melhor, onde você reproduz o intervalo determinado de confirmação no topo do seu ramo de integração, como Charles Bailey descreveu aqui .
(também, procure "Aqui está como você transplantaria uma ramificação de tópico com base em uma ramificação para outra" na página do manual git rebase , para ver um exemplo prático de git rebase --onto
)
Se sua ramificação atual for integração:
# 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
Isso repetirá tudo entre:
- após o pai
first_SHA-1_of_working_branch_range
(daí o ~1
): o primeiro commit que você deseja reproduzir
- até "
integration
" (que aponta para o último commit que você deseja reproduzir, a partir da working
ramificação)
para " tmp
" (que aponta para onde integration
estava apontando antes)
Se houver algum conflito quando uma dessas confirmações for repetida:
- resolva-o e execute "
git rebase --continue
".
- ou pule este patch e execute "
git rebase --skip
"
- ou cancele tudo com um "
git rebase --abort
" (e recoloque o integration
ramo no tmp
ramo)
Depois disso rebase --onto
, integration
voltaremos ao último commit da ramificação de integração (isto é " tmp
" branch + todas as confirmações reproduzidas)
Com a seleção de cereja ou rebase --onto
, não se esqueça, isso tem consequências nas mesclagens subsequentes, conforme descrito aqui .
Uma cherry-pick
solução " " pura é discutida aqui e envolveria algo como:
Se você deseja usar uma abordagem de patch, "git format-patch | git am" e "git cherry" são suas opções.
Atualmente, git cherry-pick
aceita apenas um único cometer, mas se você quer escolher o intervalo B
através de D
que seria B^..D
em git linguagem, de modo
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Mas de qualquer maneira, quando você precisar "repetir" uma série de confirmações, a palavra "repetir" deve empurrá-lo para usar o rebase
recurso " " do Git.