Como cherry-pick e mesclar apenas um subcaminho de um ramo de funcionalidade para mestre

0

Pergunta

Eu tenho um problema interessante (pelo menos para mim.)

Eu tenho um master de ramo e de uma feature o ramo, que foi dividida a sua forma de master há um tempo atrás. Outra equipe continua atualizando o master ramo e a minha equipa está funcionando apenas em feature ramo.

O master ramo inclui algumas alterações que a minha equipa não está interessado em. Nós apenas se preocupam com os seus app pasta, é isso. Mesmo no app pasta, não estamos interessados em tudo, somente as alterações que achamos que precisamos. Não estamos fundindo nossos feature ramo em sua master porque não há tecnologia-alterações de pilha que estamos a implementar e a única coisa que nós precisamos deles é o seu código JavaScript.

Enquanto isso, nós também estamos fazendo alterações no feature ramificação do app a pasta. Assim, no app pasta, eles têm algumas alterações que nós não temos, nós temos algumas mudanças que eles não têm. Queremos manter todas as nossas mudanças, mas apenas para pegar algumas de suas alterações.

Como faço para ir sobre a fusão de suas master ramificação do app pasta em nosso feature ramificação do app pasta? Venho pesquisando por horas, tentei algumas VS extensões de Código para visualizar a diferença entre as duas pastas. O que eu estou procurando é uma interface onde eu posso Aceitar ou Recusar tudo o que vem de master ramo de `pasta app. Embora esta seja a minha preferência, eu estou aberto a qualquer sugestão que gostaria de resolver este problema.

Isso pode parecer confuso situação, mas meu time perdeu alguns membros nos últimos meses e a diferença entre ramos cresceu mais e mais a cada semana. Agora queremos resolver isso de uma vez por todas.

Obrigado por sua ajuda.

cherry-pick git merge
2021-11-24 00:41:33
2
1

O que eu estou procurando é uma interface onde eu posso Aceitar ou Recusar tudo o que vem de branch master do app pasta

git checkout -p master app é bruto, mas representa uma boa oportunidade de servir aqui.

Se isso não se mostrando suficiente para você decidir o que você quer, o próximo passo é uma mesclagem seletiva com

git diff --merge-base @ master -- app | git apply -3

o que vai usar o Git é automerge de máquinas e de deixar qualquer sobreposição ou adjacentes alterações para você classificar para fora, como de costume, ou você pode salvar o diff para um arquivo e editá-lo para provar antes de aplicá-la se você tiver cuidado.

2021-11-24 06:42:34
1

Há duas maneiras para fazer isso. O mais simples será manter as alterações, mas descartar qualquer compromete-se eles fizeram. O mais complexo, vai preservar compromete-se.

Recomendação

Os dois métodos descritos abaixo têm o potencial de causar conflitos de mesclagem e outras dores de cabeça para baixo da linha, especialmente como as pessoas continuam a fazer alterações no branch master. Além disso, se você tem alterações para o aplicativo/ pasta no ramo de funcionalidade, diretamente usando o git apply pode resultar em mudanças que estão sendo substituídos.

Eu recomendo fortemente a fusão de mestre de ramo em ramo de funcionalidade através de git merge com não esmagar. Dada a divergência que você mencionou, pode haver conflitos de mesclagem, mas isso é OK. Conflitos de mesclagem fazer o que você deseja: eles permitem que você escolha o que muda para o aceitar e o que rejeitar.

Dito isto, aqui estão duas abordagens, que são análogos cherry-picking apenas uma única pasta.

Opção 1: Rejeitar compromete-se, manter as alterações

Esta abordagem é bastante direto, e ele usa uma combinação de git diff e git apply:

git switch feature
git diff feature..master -- app | git apply --index

O que será:

  • Mudar para o ramo de funcionalidade (este é o lugar onde você vai aplicar a alterações)
  • Obter todas as alterações feitas no branch master, que não estão no ramo de funcionalidade.
  • Filtrar apenas as alterações no app diretório
  • Aplicar as alterações através de git apply
  • Fase de mudanças, adicionando-os ao índice (isto é o que o --index opção não)

A única desvantagem desta abordagem é que ela não preservar a história, ou mensagens de confirmação.

A partir daí, você pode confirmar as alterações:

git commit -m "Apply changes made to master branch"

Opção 2: Obter tanto compromete-se e alterações

Este é um pouco mais complicado, e depende de git format-patch.

git switch feature
git format-patch --stdout feature..master -- app | git am

O que será:

  • Mudar para o ramo de funcionalidade (onde você vai aplicar a alterações)
  • Obter todas as alterações feitas no branch master, que não estão no ramo de funcionalidade
  • Filtrar somente as alterações feitas no app diretório
  • Formato estas como uma série de patches (que contém mensagens de confirmação, autores, etc.)
  • Aplicar todos esses patches usando o git am

Observe que, dependendo do conteúdo de mudanças, isso pode resultar em uma falha que você vai ter para resolver manualmente. (Ele vai alertá-lo para isso)

2021-11-24 21:55:27

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................