Merge no Visual Studio 2013 com git
Desenvolvendo o Vamoos.lá surgiu a dúvida de como resolver conflitos ao tentar realizar um push/pull no repositório do git utilizando o Visual Studio. Pois bem, como essa situação não é algo corriqueiro de se ver (utilizar git no processo de desenvolvimento com Visual Studio) tive que simular essa situação e sair caçando e testando como atuar nessa situação.
Para mostrar como atuar e solucionar quando estiver nessa situação criei o procedimento passo a passo para explicar como proceder nesse caso. Esse artigo simula a iteração de dois usuários já que para que ocorra esse problema de merge o fato de ter dois usuários ou dois commits oriundos de repositórios clonados diferentes.
Então Vamoos.lá?
Situação original em ambos os repositórios:
O fonte original é relativamente simples afinal nosso objetivo é demonstrar como resolver conflito e não o fonte. Como pode ser observado através da imagem existem dois métodos sendo que cada um exibe uma mensagem para o usuário.
Iteração do Usuário 1 / Repositório 1:
O usuário realiza as alterações desejadas, nesse caso simplesmente alteramos a mensagem de exibição (imagem acima) para uma outra mensagem.
E efetua o commit e push para o repositório central (imagem abaixo).
Com isso finalizamos o processo de alteração do primeiro usuário. Simples não?!
Iteração do Usuário 2 / Repositório 2:
Então começa o processo do segundo usuário, você no caso. E efetua algumas alterações no fonte. Abaixo segue o fonte com as atualização que foram efetuadas tanto no primeiro método, onde foram alteradas a mensagem padrão e adicionadas novas linhas, bem como no segundo método (imagem abaixo).
Então, como de praxe, tendo terminado o trabalho irá efetuar o commit para submeter ao repositório central (imagem abaixo).
E eis que de repente, ao tentar realizar o push para o servidor acontece a seguinte mensagem:
Normal! A questão é simples! O repositório central está rejeitando sua operação pois tentou-se submeter alguns commits mas seu repositório local não contém todos os commits que o repositório central possui (Explicação bem generalista e sem muito termo técnico para não confundir). Ou seja, antes de enviar suas alterações, você deve baixar as alterações que o repositório central possui e o repositório local não.
Mas por que isso? Por que não fazer o merge automático no repositório central? Porque como foi realizado alterações nos dois repositórios, o repositório central exige que o merge seja feito pelo usuário pois não é ele (repo central) quem tem a capacidade de analisar se o que encontra-se em um fonte deve ou não ser adicionado a versão final ou de que forma essa alteração deva ser armazenada.
Como resolver então? É necessário fazer um pull para que o repositório local receba os commits que o repositório central possue e o local não.
Ponto interessante: se as alterações locais e remotas foram realizadas em arquivos distintos, o próprio git faz o merge para você.
Mas, esse não é o caso aqui. Então ao efetuar o pull a mensagem abaixo é exibida, onde o git está alertando que existem conflitos a serem resolvidos (imagem abaixo).
Ao ver essa mensagem, devemos selecionar a opção "Resolve the conflicts" onde será exibida a lista de arquivos que encontram-se em situação de conflito. Ao selecionar o arquivo irá aparecer as opções para você comparar os estados do arquivo local e remoto.
Para solucionar o problema existem três opções (imagem acima), são elas:
- Take Local: Descarta as alterações que encontram-se no servidor e utiliza seu arquivo local. Tome cuidado com essa opção pois as alterações que foram efetuadas pelo usuário remoto serão descartadas e o fonte que encontra-se em sua máquina será utilizado por completo!! Não somente nos trechos de conflito.
- Take remote: Descarta as alterações que encontram-se localmente e utiliza o arquivo arquivo que encontra-se remotamente. Tome cuidado com essa opção pois as alterações que foram efetuadas localmente serão descartadas e o fonte que encontra-se no repositório central será utilizado por completo!! Não somente nos trechos de conflito.
- Merge: Será aberto uma tela dividida em três (imagem abaixo) onde na comparação acima irá trazer o tanto o fonte remoto como o local lado a lado para que seja possível comparar e no trecho inferior o resultado que será utilizado.
Nesse caso utilizamos a opção "Merge" e efetuamos as alterações desejadas. Após efetuar essas alterações acionamos a função "Accept Merge". Isso indica para o VS que o merge foi efetuado.
Após ter efetuado esse procedimento para todos os arquivos que encontram-se em conflito será exibida a opções "Commit Merge" E ao selecionar essa opção será exibida a tela de commit solicitando um comentário para o mesmo, por padrão já irá trazer uma mensagem com um texto indicando os arquivos que foram realizados o commit.
Ao efetuar esse commit basta apenas efetuar o push para o servidor das alterações.
Et voilà! Seu merge foi realizado!