Controle de versão é um sistema que registra alterações em um arquivo ou conjunto de arquivos ao longo do tempo, para que você possa, se necessário, recuperar e manipular versões específicas ao longo do tempo.

Por quê o controle de versão é importante no processo desenvolvimento de software?

É importante compreender que “Controlar versões” de artefatos faz parte de diversos métodos de gestão de projetos.

Em geral o controle de versão é utilizado em arquivos de código-fonte de software que possuam controle de versão, embora na realidade você possa fazer isso com quase qualquer tipo de arquivo em um computador.

Assista o vídeo deste conteúdo

Se você é um designer gráfico, web designer ou programador - desenvolvedor de software, e quer manter todas as versões de uma imagem, layout de site (seus arquivos html e css) ou código-fonte de programa de computador - o que você certamente deveria querer, um sistema de controle de versão (VCS - Version Control System) é a ferramenta correta a ser usada.

Retornos no uso

Praticar o controle de versão de software ou projeto de outra natureza, possibilita à equipe atingir uma série de benefícios.

Desta maneira utilizar Controle de versão permite:

  • que você reverta para qualquer estado anterior determinados arquivos ou um projeto inteiro
  • compare as mudanças entre arquivos fonte ao longo do tempo
  • verifique quem modificou pela última vez algo que pode estar causando um problema
  • verifique quando e quem introduziu um determinado problema

Usar um VCS também significa que se você estragar tudo, por exemplo alterou uma rotina em um sistema e introduziu um erro crítico; ou ainda perder arquivos, pode facilmente recuperar a versão anterior e correta com muito pouco trabalho.

Tipos de Softwares para Controle de Versão

Podemos citar três estratégias diferentes de sistemas que podem ser utilizadas para controlar versões de arquivos ou projetos, são elas:

  • sistemas locais de controle de versão
  • sistemas centralizados de controle de versão
  • sistemas distribuídos de controle de versão

Sistemas Locais de Controle de Versão

O método para controlar versão de muitas pessoas é copiar os arquivos para outro diretório - talvez um diretório com carimbo de tempo.

Esta abordagem é muito comum porque é simples, mas também é incrivelmente propensa a erros. É fácil esquecer em qual diretório você está e, acidentalmente, sobrescrever o arquivo errado ou copiar arquivos que não deveria.

Buscando resolver este problema, programadores há muito tempo desenvolveram os VCS locais que possuem um banco de dados simples o qual mantêm todas as alterações nos arquivos sob controle de revisão.

Na figura de exemplo, o arquivo representado pelo ícone verde, tem suas várias versões referenciadas dentro do banco de dados de versão. Tudo isto sendo controlado no computador local.

Diagrama representando Sistema de Controle de Versão Local
Diagrama representando Sistema de Controle de Versão Local

Softwares de Controle de Versão Locais

Uma das ferramentas VCS Locais mais populares foi um sistema chamado RCS, que ainda é distribuído com muitos computadores atualmente.

Até mesmo o popular sistema operacional Mac OS X inclui o comando rcs quando você instala as Ferramentas de Desenvolvimento.

O RCS funciona mantendo conjuntos de alterações (ou seja, as diferenças entre os arquivos) em um formato especial no disco rígido; ele pode, em seguida, re-criar qualquer arquivo como era em qualquer ponto no tempo, para isto adicionando todas as suas alterações.

Sistemas Centralizados de Controle de Versão - CVCS

A próxima questão importante que as pessoas encontram é a necessidade delas colaborarem com desenvolvedores em outros sistemas ou projetos.

Para lidar com este problema, os Sistemas Centralizados de Controle de Versão (CVCS) foram desenvolvidos.

Estes sistemas, têm um único servidor que contém todos os arquivos de controle de versão, e um número de clientes que usam arquivos a partir desse local central.

Por muitos anos, esta foi a estratégia padrão da indústria de desenvolvimento de software para o controle de versão de programas.

Na figura de exemplo a seguir, o controle de versão é centralizado em um computador na rede, o servidor central de VCS.

Diagrama representando um Sistema de Controle de Versão Centralizado CVCS
Diagrama representando um Sistema de Controle de Versão Centralizado CVCS

Neste computador central fica o banco de dados com as versões dos arquivos.

Cada pessoa que necessita trabalhar com um determinado arquivo, deve realizar um checkout do mesmo para o seu computador, e, após alterá-lo, realizar um checkin retornando as mudanças para o servidor central.

Softwares de Controle de Versão Centralizados

Exemplos de CVCS são o Subversion e o Perforce.

O Subversion chegou a ser o mais utilizado sistema de controle de versão no início dos anos 2000.

Vantagens dos Controles de Versão Centralizados

Esta configuração oferece muitas vantagens sobre o controle de versão local. Por exemplo: todo mundo sabe, até certo ponto o que todos os envolvidos no projeto estão fazendo.

Os administradores têm controle refinado sobre quem pode realizar quais alterações; sendo também muito mais fácil de administrar um servidor centralizado do que lidar com bancos de dados locais em cada computador “cliente”.

Desvantagens dos Controles de Versão Centralizados

No entanto, esta configuração também tem** algumas desvantagens** graves.

O mais óbvio é o ponto único de falha que o servidor centralizado representa. Se esse servidor apresentar problemas por uma hora, durante este período ninguém poderá colaborar ou salvar as alterações de versão para o que quer que eles estejam trabalhando.

Se o disco rígido do banco de dados central for corrompido, e backups apropriados não forem mantidos, você perde absolutamente tudo - toda a história do projeto, exceto imagens pontuais que desenvolvedores possam ter em suas máquinas locais.

Sistemas VCS locais sofrem com esse mesmo problema, isto significa que sempre que você tem toda a história do projeto em um único local, existe o alto risco de perder tudo.

Sistemas Distribuídos de Controle de Versão - DVCS

É neste ponto que Sistemas Distribuídos de Controle de Versão (DVCS) entram em cena. Atualmente pode-se afirmar que estes sistemas se confundem com a explicação sobre “o que é controle de versão”.

Em um DVCS os clientes não somente usam o estado mais recente dos arquivos: eles duplicam localmente o repositório completo.

Clique aqui e leia este artigo no blog, que ensina o Git básico

Desta maneira, se qualquer servidor morrer, e diversas pessoas estiverem colaborando por meio de um sistema distribuído de controle de versão, qualquer um dos repositórios de clientes podem ser copiado de volta para o servidor para restaurá-lo.

Podemos afirmar que cada clone de repositório é, de fato, um backup completo de todos os dados.

Na figura de exemplo a seguir, o controle de versão possui um repositório central, onde todos os clientes colaboram enviando suas alterações e recuperando as mudanças dos demais colaboradores.

Diagrama representando um Sistema de Controle de Versão Distribuído - DVCS
Diagrama representando um Sistema de Controle de Versão Distribuído - DVCS

Porém, como está demonstrado na figura, em cada computador, o banco de dados de versão é duplicado entre os diversos colaboradores, de forma a apresentar distribuidamente diversas cópias dentre todos os colaboradores.

Além disso, muitos desses sistemas trabalham muito bem com vários repositórios remotos, tal que você possa colaborar em diferentes grupos de pessoas de maneiras diferentes ao mesmo tempo dentro do mesmo projeto.

Isso permite que você configure vários tipos de fluxos de trabalho que não são possíveis em sistemas centralizados, como, por exemplo, modelos de trabalho hierárquicos.

Softwares para Controle de Versão Distribuídos

Os softwares de controle de versão distribuídos mais conhecidos são: Git, Mercurial, Bazaar e ainda Darcs.

Atualmente, principalmente nos projetos de desenvolvimento de software, a principal ferramenta de versionamento de software é o Git.

Ele é usado inclusive como a base para serviços de gerenciamento de repositórios como Github e Gitlab.

Você pode ter uma visão geral do uso de Git no artigo Git Básico, ou conhecer algumas dicas e truques no artigo Git – Dicas Rápidas.

Se já conhece um pouco de Git mas têm dúvidas quanto a alguns conceitos essenciais, leia o artigo Diferença de TAG e BRANCH em GIT.

Considerações finais

Conhecer os conceitos e aplicar versionamento de software, principalmente para os projetos de desenvolvimento de software é essencial para garantir altos níveis de qualidade nos produtos finais.

Para continuar evoluindo neste conhecimento, leia o artigo O que é Gerenciamento de código fonte.

Este post apresentou uma visão geral sobre o que é controle de versão e suas diferentes abordagens por sistemas. Ele é livremente baseado no livro Pro Git.