git – escolha de cereja – HOWTO / WHYTO

Problema: Você quer testar um recurso que alguém desenvolveu, mas ele só existe em um ramo remoto que está lamentavelmente desatualizado.

Fonte

  1. Como o cherry-pick resolve o problema?
  2. Por que não uso git am ou git apply?

Problema: Você quer testar um recurso que alguém desenvolveu, mas ele só existe em um ramo remoto que está lamentavelmente desatualizado.

Se você mesclass ou se recompusesse, teria várias alterações antigas, possivelmente conflitantes.

Com o cherry picking, você pega um conjunto de mudanças e o reproduz como um novo commit sobre outro branch.

Isso é útil se você quiser apenas um commit em outro branch, sem seu histórico.

É útil usar a opção -x , portanto, a mensagem de confirmação contém uma nota de onde foi escolhida.

Por que não uso git am ou git apply?

porque git apply é para aplicar patches (arquivos), e git sou para aplicar séries de patches. git cherry-pick aplica commits – isto é, confirma o seu próprio repo, vs confirma que você importa de outras repos.

De git help cherry-pick :

git-cherry-pick – Aplique as alterações introduzidas por alguns commits existentes

[…]

Dado um ou mais commits existentes, aplique a mudança que cada um introduz, registrando um novo commit para cada um. Isso requer que sua tree de trabalho esteja limpa (sem modificações do commit HEAD).

Então, quando você cherry-pick um commit, o git pega as mudanças do commit (its diff ) e tenta aplicá-lo no seu diretório de trabalho atual, criando um novo commit que é equivalente ao que você está cherry-pick .

É uma maneira de refazer as alterações de outro commit em uma linha de histórico diferente.

Além de fazer as alterações, o cherry-pick também preserva as informações do commit original como autor e isso.

Por último, o cherry-pick pode receber um grupo de commits para aplicar, caso em que ele agiria como uma cherry-pick -os um por um, em ordem cronológica (mais antigo primeiro).

Problema:
Você quer testar um recurso que alguém desenvolveu, mas ele só existe em um ramo remoto que está lamentavelmente desatualizado.

Isso resolve o problema porque:

  • você não deseja mesclar a ramificação antiga, incluindo confirmações que não são mais relevantes em seu estado atual de desenvolvimento
  • você não quer rebase sua ramificação em cima de uma ramificação antiga apenas para obter essa confirmação.
  • você não precisará mesclar sua filial para aquela ramificação antiga

O último ponto é importante porque a primeira desvantagem do cherry-picking é que ele introduz commits duplicados . Mas no seu caso, isso não importa.

A outra desvantagem é que o commit que você está escolhendo pode ter dependencies funcionais baseadas em commits anteriores (daquele branch antigo).
Em outras palavras, seu código funciona apenas por causa de outros códigos de outros commits antigos (que não são escolhidos a dedo).
Isso pode ser mais complicado de detectar.