Mesclando branchs com um histórico de commits diferentes.

Uma breve introdução:

Amanda Mussio
IM+: finanças e investimentos

--

Algumas vezes possuímos a necessidade de mesclar commits de histórias completamente diferentes.

Em agosto de 2019 a Play store decidiu que não suportaria mais aplicativos que não estavam adequados a arquitetura 64bits.

O Fliper é um aplicativo grande e estávamos utilizando o react-native@0.55 na época. Porém, devido à essa necessidade, atualizar as bibliotecas e o react-native para a versão 0.59 foi bem custoso e acabou não funcionando. Decidimos por criar uma nova instalação e migrar os arquivos.

Nos deparamos com a seguinte situação:

  1. Nosso repositório principal estava com o código até então estável e rodando em produção;
  2. Necessidade de monitorar os novos arquivos no mesmo repositório;
  3. Quando os novos arquivos estivessem estáveis, juntar os dois históricos, mantendo o antigo porém dando prioridade na mesclagem para o atual;

Como resolver esse tipo de cenário?

Passo 1

Adicione o remoto do git aos seus novos arquivos locais:

$ git remote add origin https://github.com/user/repo.git

Crie uma branch nova (aqui vamos chamá-la de branchExemplo):

$ git checkout -b branchExemplo

Adicione os arquivos e commit:

$ git add .

$ git commit -m "descrição das minhas alterações"

Envie para o remoto:

$ git push origin branchExemplo

Passo 2

Aqui eu presumo que você já tenha finalizado todas as suas alterações que precisava e quer transformar a sua branch em seu código principal, ou seja colocar na master.

Para isso vamos utilizar um comando de estratégia do git. Na branchExemplo :

$ git merge -s ours master --allow-unrelated-histories

Quebrando esse código temos:

  1. git merge: Mescla as alterações entre as branches;
  2. -s ours: Abreviação de --strategy=ours. Essa é a estratégia que escolhemos, nossos arquivos tem prioridade sobre o da branch master;
  3. master : o nome da branch ao qual vamos mesclar as alterações;
  4. --allow-unrelated-histories : Permite que eu mescle alterações que não partilhem de um mesmo histórico. (Por curiosidade rode o comando sem esse último passo e veja a mensagem);

Pronto agora temos a nossa branchExemplo pronta para substituir master. Ela possui todo nosso histórico anterior e também nossa nova linha do tempo.

Passo 3

Volte a sua branch master :

$ git checkout master

Execute-o:

$ git merge branchExemplo

Empurre suas alterações para master no remoto:

$ git push origin master

E pronto. Estratégia concluída.

Conclusão

O git oferece uma série de estratégias para resolver situações do dia a dia. Mas às vezes compilar isso tudo em um único comando pode exigir um pouco de esforço. Se tivesse em um projeto pessoal pequeno poderia ter usado apenas um push --force. Mas, em situações como essa, vale a pena quebrar a cabeça.

--

--