Como mesclar um commit específico de um ramo para outro no Git?

159

Eu tenho BranchA113 que está comprometido à frente BranchB.

Mas eu só quero que os 10 últimos commits sejam BranchAmesclados BranchB.

Existe uma maneira de fazer isso?

NullVoxPopuli
fonte
6
possível duplicata Como mesclar um commit específico em git
chharvey

Respostas:

233

o git cherry-pick <commit> comando permite que você faça um único commit (de qualquer ramificação) e, essencialmente, a refaça na sua ramificação de trabalho.

O capítulo 5 do livro Pro Git explica melhor do que eu , completo com diagramas e coisas do tipo. ( O capítulo Rebasing também é uma boa leitura.)

Por fim, existem alguns bons comentários sobre a escolha da cereja contra a mesclagem e o rebaseamento em outra questão SO .

ewall
fonte
1
Pergunta: digamos que commit Aseja ramificado mastere você faz algum trabalho nele, criando child commits Bpor meio dele E. Digamos que Eapenas 1 linha foi adicionada de D. Se você git cherry-pick Eentrar master, aplica todas as alterações de Aaté Ea masterramificação ou aplica apenas a alteração de Dpara E, ou seja, adiciona apenas essa 1 linha a master? Se o caso for o primeiro, como faço para conseguir o último? (além de copiar e colar manualmente)
chharvey
7
git cherry-pick -n <commit> Se você não deseja que a escolha da cereja seja confirmada automaticamente.
Ben Flynn
6

Se o BranchA não foi enviado para um controle remoto, você pode reordenar as confirmações usando rebasee simplesmente merge. É preferível usar mergemais rebasequando possível, porque não criar commits duplicados.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
Seth Reno
fonte
2

FONTE: https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

A outra maneira de mover o trabalho introduzido de um ramo para outro é selecioná-lo. Uma escolha de cereja no Git é como uma rebase para um único commit. Ele pega o patch que foi introduzido em um commit e tenta reaplicá-lo no ramo em que você está atualmente. Isso é útil se você tiver várias confirmações em uma ramificação de tópico e desejar integrar apenas uma delas, ou se tiver apenas uma confirmação em uma ramificação de tópico e preferir selecioná-la em vez de executar a rebase. Por exemplo, suponha que você tenha um projeto parecido com este:

insira a descrição da imagem aqui

Se você deseja inserir o commit e43a6 em sua ramificação principal, é possível executar

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

Isso puxa a mesma alteração introduzida no e43a6, mas você obtém um novo valor de confirmação SHA-1, porque a data aplicada é diferente. Agora, seu histórico fica assim:

insira a descrição da imagem aqui

Agora você pode remover a ramificação do tópico e soltar as confirmações que não deseja obter.

artamonovdev
fonte