Ambos rebase
(e cherry-pick
) e merge
têm suas vantagens e desvantagens. Eu defendo merge
aqui, mas vale a pena entender os dois. (Procure aqui uma resposta alternativa bem fundamentada, enumerando os casos em que rebase
é preferível.)
merge
é preferido em vez de cherry-pick
e rebase
por algumas razões.
- Robustez . O identificador SHA1 de uma confirmação identifica-a não apenas em si mesma, mas também em relação a todas as outras confirmações que a precedem. Isso oferece uma garantia de que o estado do repositório em um determinado SHA1 é idêntico em todos os clones. Não há (em teoria) chance de alguém ter feito o que parece ser a mesma mudança, mas na verdade está corrompendo ou sequestrando seu repositório. Você pode escolher as mudanças individualmente e elas provavelmente são as mesmas, mas você não tem garantia. (Como uma questão secundária secundária, as novas confirmações escolhidas pela cereja ocuparão espaço extra se alguém escolher novamente a mesma confirmação, pois ambas estarão presentes na história, mesmo que suas cópias de trabalho acabem sendo idênticas.)
- Facilidade de uso . As pessoas tendem a entender o
merge
fluxo de trabalho com bastante facilidade. rebase
tende a ser considerado mais avançado. É melhor entender os dois, mas as pessoas que não querem ser especialistas em controle de versão (que na minha experiência incluiu muitos colegas que são muito bons no que fazem, mas não querem gastar o tempo extra) são mais fáceis. tempo apenas se fundindo.
Mesmo com um fluxo de trabalho pesado de mesclagem rebase
e cherry-pick
ainda são úteis para casos específicos:
- Uma desvantagem
merge
é a história desordenada. rebase
impede que uma longa série de confirmações seja espalhada no seu histórico, como seria se você mesclasse periodicamente as alterações de outras pessoas. Na verdade, esse é o seu principal objetivo, como eu o uso. O que você deseja ter muito cuidado é nunca rebase
codificar que você compartilhou com outros repositórios. Depois que um commit é push
editado, alguém pode ter cometido o mesmo, e o rebasing causará, na melhor das hipóteses, o tipo de duplicação discutido acima. Na pior das hipóteses, você pode acabar com um repositório muito confuso e com erros sutis que levarão muito tempo para serem descobertos.
cherry-pick
é útil para amostrar um pequeno subconjunto de alterações de um ramo de tópico que você basicamente decidiu descartar, mas percebeu que existem algumas partes úteis.
Quanto a preferir mesclar muitas alterações a uma: é muito mais simples. Pode ser muito entediante fazer mesclagens de conjuntos de alterações individuais quando você começar a ter muitos deles. A resolução de mesclagem no git (e no Mercurial e no Bazaar) é muito, muito boa. Você não terá grandes problemas ao mesclar ramos longos na maioria das vezes. Geralmente, mesclo tudo de uma só vez e, somente se tiver um grande número de conflitos, faço backup e re-executo a mesclagem aos poucos. Mesmo assim, faço-o em grandes pedaços. Como um exemplo muito real, tive um colega que tinha três meses de alterações a serem mescladas e obtive cerca de 9000 conflitos em 250000 linhas de código-base. O que fizemos para correção é fazer vale o merge um mês de cada vez: conflitos não acumular linearmente, e fazê-lo em pedaços resultados em muitomenos de 9000 conflitos. Ainda era muito trabalho, mas não tanto quanto tentar fazer um commit de cada vez.
Na minha opinião, a escolha da cereja deve ser reservada para situações raras em que é necessária, por exemplo, se você corrigiu diretamente o ramo 'mestre' (tronco, ramo de desenvolvimento principal) e percebeu que deveria ser aplicado também ao 'maint ' Você deve basear o fluxo de trabalho na mesclagem ou no rebase (ou "git pull --rebase").
Lembre-se de que a confirmação escolhida ou rebaseada é diferente do ponto de vista do Git (possui um identificador SHA-1 diferente) do original, portanto, é diferente da confirmação no repositório remoto. (O rebase geralmente pode lidar com isso, pois verifica o ID do patch, ou seja, as alterações, não o ID de confirmação).
Também no git, você pode mesclar vários ramos de uma só vez: a chamada fusão de polvos . Observe que a fusão do polvo precisa ter sucesso sem conflitos. No entanto, pode ser útil.
HTH.
fonte
git blame
encontrar a confirmação que introduziu o bug egit branch --contains
determinar onde mesclar a ramificação. Descrito com mais detalhes neste postRebase e Cherry-pick são a única maneira de manter um histórico de consolidação limpo. Evite usar mesclagem e evite criar conflito de mesclagem. Se você estiver usando o gerrit, configure um projeto para Mesclar, se necessário, e um projeto para o modo de seleção de cereja e tente você mesmo.
fonte