Conceitos do controle de versão: Resolvendo conflitos utilizando Tortoise SVN

Em um ambiente de desenvolvimento onde existe o controle de versões do código fonte e um grande número de desenvolvedores trabalhando no mesmo produto, uma das situações mais comuns no dia a dia é a ocorrência de conflitos ao se atualizar a cópia local do código fonte para receber as últimas alterações de determinado arquivo, ou seja, o famoso comando Update .

A TecnoSpeed utiliza o controlador de versões Subversion® através da ferramenta open-source TortoiseSVN. Nesse Post será considerado que os conceitos básicos do controle de versão como: Repository, revision, trunk, update, commit, revert, checkout, externals já são conhecidos.

Existem mais de um tipo de conflito, mas nesse post trataremos do tipo mais comum: Conflito de Arquivo (file conflict) . Um conflito de arquivo acontece quando dois desenvolvedores alteram as mesma linhas de código (ou a mesma linha) de um mesmo arquivo fonte. Isso acontece porque cada desenvolvedor possui sua cópia local do repositório, e cada um faz suas alterações localmente. E quando um dos desenvolvedores dá o comando Update para atualizar sua cópia do arquivo o SVN indica que existe um conflito em determinadas linhas do arquivo, mas o SVN não resolve nenhum conflito de forma automática, pois ele não conhece nada sobre a estrutura do projeto em questão.

O SVN faz somente um marcação sobre as linhas onde ocorreu o conflito e cabe ao desenvolvedor resolver o conflito e manter a estrutura e a lógica do código fonte correta. Para visualizar melhor os conceitos e a resolução de um conflito de arquivo, vamos iniciar um passo a passo da resolução de um conflito simples em um arquivo .pas que possui somente uma função que mostra alertas na tela com determinada frase.

Passo 1

Considere o arquivo MostraMensagens.pas com o seguinte conteúdo:

|543px;x242px;

Figura 1.

Passo 2

Considere que o desenvolvedor 1 fez a seguinte alteração conforme abaixo:

|534px;x237px;

Figura 2.

Houve uma mudança da linha 1 da função, a frase foi trocada de ‘Olá’ para ‘Oi’

Passo 3

Agora considere que o desenvolvedor 2 também alterou a mesma linha em sua cópia local conforme abaixo:

|481px;x238px;

Figura 3.

O desenvolvedor 2 também fez uma alteração na linha 1 da função, trocando a frase de ‘Olá’ para ‘E ai!’.

Passo 4

Agora considere que o desenvolvedor 1 executou o comando Update para atualizar sua cópia da função MostraMensagens(). O SVN irá indicar que ocorreu um conflito no arquivo MostraMensagens.pas, conforme imagem abaixo:

Figura 4

Passo 5

Clicando com o botão direito do mouse na linha indicada em vermelho podemos escolher a opção para editar o conflito (edit conflict) ou o mesmo que resolver o conflito, conforme imagem abaixo:

|526px;x345px;

Figura 5

Passo 6

Após clicar em Edit Conflicts um editor será aberto e poderemos verificar exatamente qual linha está em conflito, conforme imagem abaixo:

Figura 6

Note no editor que do lado esquerdo é mostrado o conteúdo da função MostrarMensagens() com a mudança do desenvolvedor 2, em destaque note a palavra Theirs que indica ao desenvolvedor 1 que deu o comando de Update que a alteração foi feita por outro desenvolvedor. (Mudança de ‘Olá’ para ‘E ai!’)

No lado direito note que também é mostrado o conteúdo da função indicada com a palavra Mine que indica ao desenvolvedor 1 que essa é a sua alteração feita na sua cópia local. (Mudança de ‘Olá’ para ‘Oi’)

Passo 7

Para resolver o conflito vamos utilizar o botão Use Blocks conforme figura abaixo:

|460px;x356px;

Figura 7

Existem 4 opções para a resolução desse conflito:

  1. Use ‘Theirs’ text block : significa que o resultado final será a utilização da alteração feita pelo desenvolvedor 2. A primeira linha da função irá ficar com a frase ‘E ai!’ ignorando a alteração feita pelo desenvolvedor 1. (Figura 8)
  2. Use ‘mine’ text block : significa que o resultado final será a utilização da alteração do desenvolvedor 1. A primeira linha da função irá ficar com a frase ‘Oi’ ignorando a alteração do desenvolvedor 2. (Figura 9)
  3. User ‘Theirs’ text block then ‘mine’ : significa que a função irá utilizar como primeira linha a alteração feita pelo desenvolvedor 2 (frase ‘E ai!’) e após a segunda linha ficará com a alteração do desenvolvedor 1 (frase ‘Oi’), ou seja, aconteceu um Merge , ou com outras palavras uma união das duas alterações. (Figura 10)
  4. Use ‘Mine’ text block then ‘Theirs’ : o SVN também irá manter as duas alterações feitas pelos desenvolvedores 1 e 2 só que na ordem inversa. A alteração do desenvolvedor 1 ficará na primeira linha e a do desenvolvedor 2 na segunda. (Figura 11)

Figura 8.

Figura 9.

Figura 10.

Figura 11.

Após escolher a forma de resolução do conflito, basta clicar no botão salvar e na tela que surge a opção Marked as Resolved conforme figura abaixo:

Figura 12.

Conforme podemos verificar nesse exemplo de resolução de conflito o SVN somente indica ao desenvolvedor que um conflito ocorreu e cabe a esse verificar qual é a solução para o mesmo. Existem casos onde os desenvolvedores precisam entrar em acordo para resolver o conflito e manter o projeto funcionando corretamente.