Mesclando branchs com um histórico de commits diferentes.
Uma breve introdução:
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:
- Nosso repositório principal estava com o código até então estável e rodando em produção;
- Necessidade de monitorar os novos arquivos no mesmo repositório;
- 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:
git merge
: Mescla as alterações entre as branches;-s ours
: Abreviação de--strategy=ours
. Essa é a estratégia que escolhemos, nossos arquivos tem prioridade sobre o da branch master;master
: o nome da branch ao qual vamos mesclar as alterações;--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.