Endrigo Antonini

Merge no Visual Studio 2013 com git

July 16, 2014 | 5 Minute Read

visual-studio-2013-logoDesenvolvendo 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:

001-original

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:

002-usuario01-alteracoes

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).

003-usuario01-commit

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).

004-minhas-alteracoes

Então, como de praxe, tendo terminado o trabalho irá efetuar o commit para submeter ao repositório central (imagem abaixo).
005-minhas-alteracoes-commit

E eis que de repente, ao tentar realizar o push para o servidor acontece a seguinte mensagem:
006-minhas-alteracoes-push

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).
007-minhas-alteracoes-pull

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.

008-minhas-alteracoes-start-mergePara 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.

009-minhas-alteracoes-merge

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.

011-minhas-alteracoes-commit-merge

Ao efetuar esse commit basta apenas efetuar o push para o servidor das alterações.

013-minhas-alteracoes-push

Et voilà! Seu merge foi realizado!

comments powered by Disqus

Related Posts

Introdução ao Maven

Autenticidade no git com o uso de chave GPG

Artigo sobre FlyWay