Eu tenho dois galhos. Commit a
é a cabeça de um, enquanto o outro tem b
, c
, d
, e
e f
no topo a
. Eu quero mover c
, d
, e
e f
a primeira filial sem comprometer b
. Usando cereja escolher é fácil: check-out primeiro ramo cherry-pick um por um c
para f
e rebase segundo ramo em primeiro lugar. Mas há alguma maneira de cherry-pick tudo c
- f
em um comando?
Aqui está uma descrição visual do cenário (obrigado JJD ):
b
basear-sef
mais tarde, mas que não tem nada a ver com o cherry-picking.)Respostas:
O Git 1.7.2 introduziu a capacidade de escolher uma variedade de confirmações. Nas notas de versão :
Para escolher todos os commits de commit
A
para commitB
(ondeA
é mais antigoB
), execute:Se você deseja ignorar o próprio A, execute:
(O crédito vai para damian, JB Rainsberger e sschaef nos comentários)
fonte
git cherry-pick A^..B
git cherry-pick f~3
-osgit cherry-pick f~2
etc. etc. atégit cherry-pick f
(pressionar a seta para cima obtém o comando anterior para que eu possa alterar rapidamente o número e executar deve ser semelhante na maioria dos consoles).git cherry-pick master..somebranch
selecionará todos os commits em somebranch desde o master (supondo que já tenha sido reestruturado no master) e os aplicará à sua ramificação atual.A maneira mais simples de fazer isso é com a
onto
opção derebase
. Suponha-se que o ramo que termina em curso aa
é chamado mybranch e este é o ramo que você deseja moverc
-f
em.fonte
git checkout secondbranch && git rebase mybranch
para a resposta completarebase
o modo interativo. Obrigado, @Charles!--interactive
para remover alguns commits da sequência ou reordená-los antes da "escolha de cerejeira". +1b
neste exemplo), mas sim, isso funcionou para mim.Ou o pedido único:
fonte
Você pode usar uma combinação serial
git rebase
egit branch
aplicar um grupo de confirmações em outra ramificação. Como já postado por wolfc, o primeiro comando realmente copia os commits. No entanto, a alteração não estará visível até você adicionar um nome de filial à confirmação mais importante do grupo.Por favor, abra a imagem em uma nova aba ...
Para resumir os comandos no formato de texto:
gitk --all &
.git rebase --onto a b f
.HEAD
está marcado.git branch selection
Isso deve esclarecer as coisas:
a
é o novo destino raiz do grupo.b
é o commit antes do primeiro commit do grupo (exclusivo).f
é o último commit do grupo (inclusive).Depois, você pode usar
git checkout feature && git reset --hard b
para excluir as confirmaçõesc
atéf
dofeature
ramo.Além desta resposta, escrevi uma postagem no blog que descreve os comandos em outro cenário que deve ajudar a usá-lo geralmente.
fonte
git rebase --onto a b mybranch
e btw - qual programa essas imagens bacanas do Git?Para aplicar os comentários de JB Rainsberger e sschaef para responder especificamente à pergunta ... Para usar um intervalo de seleção de cereja neste exemplo:
ou
fonte
git 2.7.0.windows.1
e notei que, quando tento escolher uma variedade de confirmações, tudo está bem, mas o git não informa em nenhum lugar o que você precisa fazergit cherry-pick --continue | --abort | --quit
antes de tentar confirmar / escolher novamente. Portanto, se você escolher uma variedade de confirmações, precisará executargit cherry-pick --continue
toda vez que estiver pronto (resolvendo conflitos ou algo assim) com uma confirmação do intervalo especificado.^
depois do c realmente significa "o commit antes de c", que é b nesse caso. É por isso quec^..f
é sinônimo deb..f
. Tente fazergit log c^..f
e você verá commits c a f, exatamente como se você fez #git log b..f
Se você tiver revisões seletivas para mesclar, digamos A, C, F, J de A, B, C, D, E, F, G, H, I, J confirma, basta usar o comando abaixo:
fonte
fonte
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Para escolher uma identificação de confirmação até a ponta do ramo, você pode usar:
git cherry-pick commit_id^..branch_name
fonte
Outra variante que vale a pena mencionar é que, se você deseja que os últimos
n
commits de um branch, a~
sintaxe pode ser útil:Nesse caso, o comando acima selecionaria os últimos 4 commit de um branch chamado
some-branch
(embora você também possa usar um hash de commit no lugar do nome do branch)fonte
Na verdade, a maneira mais simples de fazer isso seria:
MERGE_BASE=$(git merge-base branch-a branch-b)
rebase a ramificação resultante em si mesma, iniciando na base de mesclagem da etapa 1 e remova manualmente as confirmações que não são desejadas:
Como alternativa, se houver apenas algumas novas confirmações, pule a etapa 1 e simplesmente use
na primeira etapa, usando o suficiente
^
para passar da base de mesclagem.Você verá algo parecido com isto no rebase interativo:
Em seguida, remova as linhas b (e quaisquer outras que você desejar)
fonte
fonte
Aqui está um script que permitirá que você escolha cereja em várias confirmações consecutivas, simplesmente dizendo ao script quais ramificações de origem e de destino para as cerejas e o número de confirmações:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Para escolher cereja do seu ramo para o mestre (usa o ramo atual como fonte):
Para escolher os 5 commits mais recentes da ramificação 6.19.x para dominar:
fonte