Respostas:
A escolha de cereja no Git significa escolher um commit de um ramo e aplicá-lo em outro.
Isso contrasta com outras formas como merge
e rebase
que normalmente aplicam muitos commits em outro ramo.
Verifique se você está no ramo ao qual deseja aplicar o commit.
git checkout master
Execute o seguinte:
git cherry-pick <commit-hash>
NB:
Se você escolher um ramo público, considere usar
git cherry-pick -x <commit-hash>
Isso irá gerar uma mensagem de confirmação padronizada. Dessa forma, você (e seus colegas de trabalho) ainda podem acompanhar a origem da confirmação e evitar conflitos de mesclagem no futuro.
Se você tiver notas anexadas ao commit, elas não seguirão a opção de escolha. Para trazê-los também, você deve usar:
git notes copy <from> <to>
Links adicionais:
git cherry-pick -x <commit-hash>
. Isso irá gerar uma mensagem de confirmação padronizada. Dessa forma, você (e seus colegas de trabalho) ainda podem acompanhar a origem da confirmação e evitar conflitos de mesclagem no futuro.
git notes copy <from> <to>
para trazê-los também.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
maioria As pessoas tendem a pensar no commit como mudanças (como svn was iirc), mas não é, cada commit refere-se à árvore de trabalho completa. Embora isso não faça diferença neste caso, ele pode ajudar a entender por que o git funciona como ele.
Esta citação é retirada de; Controle de versão com Git (livro realmente bom, recomendo que você o compre se estiver interessado em git)
Edit: Como esta resposta ainda está sendo impressa, eu gostaria de adicionar um tutorial em vídeo muito bom sobre a ação:
Youtube: Introdução ao Git cherry-pick
Usando git cherry-pick O comando git cherry-pick commit aplica as alterações introduzidas pelo commit nomeado na ramificação atual. Ele apresentará um novo e distinto commit. A rigor, o uso do git cherry-pick não altera o histórico existente em um repositório; em vez disso, adiciona ao histórico. Como em outras operações do Git que introduzem alterações através do processo de aplicação de um diff, pode ser necessário resolver conflitos para aplicar completamente as alterações do commit fornecido . O comando git cherry-pick é normalmente usado para introduzir confirmações específicas de uma ramificação dentro de um repositório em uma ramificação diferente. Um uso comum é confirmar ou enviar porta a porta de uma ramificação de manutenção para uma ramificação de desenvolvimento.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
antes:
depois de:
A escolha da cereja no Git foi projetada para aplicar alguns commit de um ramo em outro. Isso pode ser feito se você, por exemplo. cometeu um erro e cometeu uma alteração no ramo errado, mas não deseja mesclar o ramo inteiro. Você pode apenas por exemplo. reverta o commit e escolha-o em outro ramo.
Para usá-lo, você só precisa git cherry-pick hash
, onde hash
está um hash de consolidação de outro ramo.
Para obter o procedimento completo, consulte: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Pequeno exemplo de situação, quando você precisa escolher uma cereja
Considere o seguinte cenário. Você tem dois ramos.
a) release1 - Esta filial está indo para o seu cliente, mas ainda existem alguns bugs a serem corrigidos.
b) master - ramificação master clássica, onde você pode, por exemplo, adicionar funcionalidade para o release2.
AGORA : Você corrige algo no release1 . Claro que você precisa dessa correção também no master . E esse é um caso de uso típico para a colheita de cerejas. Portanto, a escolha de cereja nesse cenário significa que você aceita um commit do branch release1 e o inclui no diretório ramo mestre .
cherry-pick é um recurso do Git. Se alguém desejar confirmar confirmações específicas em uma ramificação em uma ramificação de destino, será usada a seleção de cereja.
As etapas git cherry-pick são as seguintes.
git cherry-pick <commit id>
Aqui, o commit id é o ID da atividade de outro branch.Eg.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Eu preparei ilustrações passo a passo o que o cherry-pick faz - e uma animação dessas ilustrações (perto do fim).
L
partir da ramificação feature
):
git cherry-pick feature~2
feature~2
é o 2º commit antes feature
, ou seja, o commit L
):
Nota:
A confirmação L'
é do ponto de vista do usuário (confirmação = captura instantânea) a cópia exata da confirmaçãoL
.
Tecnicamente (internamente), é um commit novo e diferente (porque, por exemplo, L
contém um ponteiro para K
(como pai), enquanto L'
contém um ponteiro para E
).
Você pode pensar se uma escolha de cereja é semelhante a uma rebase, ou melhor, é gerenciada como uma rebase. Com isso, quero dizer que ele pega um commit existente e o regenera, assumindo, como ponto de partida, o chefe do branch em que você está atualmente.
A rebase
pega uma confirmação que tinha um pai X e regenera a confirmação como se realmente tivesse um pai Y, e é exatamente isso que a cherry-pick
faz.
A escolha da cereja é mais sobre como você seleciona os commits. Com pull
(rebase), o git regenera implicitamente seus commits locais, além do que é puxado para sua ramificação, mas com cherry-pick
você escolhe explicitamente alguns commit (s) e os regenera implicitamente (eles) sobre seu branch atual.
Portanto, a maneira como você faz isso é diferente, mas sob o capô são operações muito semelhantes - a regeneração de confirmações.
cherry-pick
se comporta da mesma maneira quando o ramo de destino é posteriormente mesclado de volta ao ramo de origem. Obrigado senhor.
É como copiar (de algum lugar) e colar (para algum lugar), mas para confirmações específicas.
Se você deseja fazer uma correção, por exemplo, pode usar o cherry-pick
recurso.
Faça isso cherry-pick
em um ramo de desenvolvimento e merge
que se comprometa com um ramo de lançamento. Da mesma forma, faça a cherry-pick
partir de uma ramificação de liberação para dominar. Voila
Quando você está trabalhando com uma equipe de desenvolvedores em um projeto, gerenciar as alterações entre vários ramos git pode se tornar uma tarefa complexa. Às vezes, você não deseja mesclar uma ramificação inteira em outra e precisa escolher apenas uma ou duas confirmações específicas. Esse processo é chamado de 'colheita da cereja'.
Encontrei um ótimo artigo sobre a escolha da cereja, confira detalhes detalhados: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Se você deseja mesclar sem confirmar os IDs, pode usar este comando
git cherry-pick master~2 master~0
O comando acima mesclará os últimos três commits do master de 1 a 3
Se você quiser fazer isso para o commit único, remova a última opção
git cherry-pick master~2
Dessa forma, você mesclará a terceira confirmação a partir do final do mestre.
Ele aplicará uma confirmação específica à sua ramificação atual.
Isso significa :
Ex: considere comprometer A
added newFileA
modified main:
+ import './newFileA'
comprometer B
added newFileB
modified main:
+ import './newFileB'
Se você escolher o commit B em outro ramo, você terminará com:
/newFileB
/main :
import './newFileA'
import './newFileB'
como o commit B contém newFileB e main , mas nenhum newFileA , resultando em um bug, portanto, use com cuidado.
Trecho dos documentos oficiais:
Dada uma ou mais confirmações existentes, aplique a alteração que cada uma introduz, registrando uma nova confirmação para cada uma. Isso requer que sua árvore de trabalho esteja limpa (nenhuma modificação do commit HEAD).
Quando não é óbvio como aplicar uma alteração, acontece o seguinte:
A ramificação atual e o ponteiro HEAD permanecem na última confirmação efetuada com êxito.
A referência CHERRY_PICK_HEAD está configurada para apontar para o commit que introduziu a alteração que é difícil de aplicar.
Os caminhos nos quais as alterações aplicadas corretamente são atualizadas no arquivo de índice e na sua árvore de trabalho.
Para caminhos conflitantes, o arquivo de índice registra até três versões, conforme descrito na seção "TRUE MERGE" do git-merge. Os arquivos da árvore de trabalho incluirão uma descrição do conflito entre colchetes pelos marcadores de conflito usuais <<<<<<< e >>>>>>>.
Nenhuma outra modificação é feita.