Introdução
Proponho discutir o propósito e várias maneiras de organizar sistemas de controle de versão.
Sistemas de controle de versão
Um sistema de controle de versão é principalmente uma ferramenta, e uma ferramenta é projetada para resolver uma certa classe de problemas. Portanto, um sistema de controle de versão é um sistema que registra alterações
em um arquivo ou conjunto de arquivos ao longo do tempo e permite que você retorne posteriormente a uma versão específica. Queremos gerenciar com flexibilidade um determinado conjunto de arquivos, reverter para certas versões, se necessário. Você pode desfazer certas alterações no arquivo, reverter sua exclusão, ver quem mudou algo. Normalmente, os sistemas de controle de versão são usados para armazenar o código-fonte, mas isso não é obrigatório. Eles podem ser usados para armazenar qualquer tipo de arquivo.
Como faço para armazenar diferentes versões de arquivos? As pessoas não recorreram imediatamente a uma ferramenta como os sistemas de controle de versão e elas próprias podem ser muito diferentes. O problema proposto pode ser resolvido usando os bons e velhos sistemas de controle de versão copy-paste, local, centralizado ou distribuído.
Copiar colar
Um método bem conhecido, quando aplicado a esse problema, pode ter a seguinte aparência: nomearemos os arquivos pelo padrão filename_ {version}, possivelmente com a adição da hora de criação ou modificação.
Este método é muito simples, mas está sujeito a vários erros: você pode trocar acidentalmente o arquivo errado, pode copiar do diretório errado (afinal, é assim que os arquivos são transferidos neste modelo).
Sistema de controle de versão local
A próxima etapa no desenvolvimento de sistemas de controle de versão foi a criação de sistemas de controle de versão locais. Eles eram um banco de dados simples que mantém registros de todas as alterações em arquivos.
Um exemplo de tais sistemas é o sistema de controle de versão RCS, que foi desenvolvido em 1985 (o último patch foi escrito em 2015) e armazena alterações em arquivos (patches) enquanto mantém o controle de versão. Um conjunto dessas mudanças permite restaurar qualquer estado do arquivo. RCS vem com Linux.
O sistema de controle de versão local faz um bom trabalho em resolver o problema, mas seu problema é a propriedade principal - localidade. Não se destina de forma alguma ao uso coletivo.
Sistema de controle de versão centralizado
O sistema de controle de versão centralizado é projetado para resolver o problema básico do sistema de controle de versão local.
Para organizar esse sistema de controle de versão, um único servidor é usado que contém todas as versões dos arquivos. Os clientes que acessam este servidor obtêm a partir deste repositório centralizado. O uso de sistemas de controle de versão centralizado tem sido o padrão por muitos anos. Isso inclui CVS, Subversion, Perforce.
Esses sistemas são fáceis de gerenciar devido a um único servidor. Mas, ao mesmo tempo, a presença de um servidor centralizado leva ao surgimento de um único ponto de falha na forma desse próprio servidor. Se este servidor estiver desabilitado, os desenvolvedores não poderão baixar arquivos. O pior cenário é a destruição física do servidor (ou o travamento do disco rígido), o que leva à perda da base de código.
Apesar de a moda do SVN ter passado, às vezes ocorre um movimento reverso - uma transição do Git para o SVN. A questão é que o SVN permite a verificação seletiva, que envolve o download de apenas alguns arquivos do servidor. Essa abordagem está ganhando popularidade ao usar monorepositórios, o que pode ser discutido posteriormente.
Sistema de controle de versão distribuído
Os sistemas de controle de versão distribuída são usados para eliminar um único ponto de falha. Eles implicam que o cliente baixará todo o repositório para si mesmo, em vez de baixar arquivos específicos de interesse do cliente. Se alguma cópia do repositório morrer, isso não levará à perda da base de código, uma vez que ela pode ser restaurada do computador de qualquer desenvolvedor. Cada cópia é um backup completo dos dados.
Todas as cópias são iguais e podem ser sincronizadas entre si. Essa abordagem é muito semelhante (e de fato é) à replicação mestre-mestre.
Este tipo de sistema de controle de versão inclui Mercurial, Bazaar, Darcs e Git. O último sistema de controle de versão será discutido em mais detalhes abaixo.
História Git
Em 2005, a empresa de controle de versão BitKeeper rompeu os laços com a comunidade do kernel Linux. A comunidade então decidiu desenvolver seu próprio sistema de controle de versão. Os principais valores do novo sistema são: descentralização completa, velocidade, arquitetura simples, bom suporte para o desenvolvimento não linear.
Conclusão
Examinamos as formas de organização dos sistemas de controle de versão, discutimos opções para resolver as tarefas atribuídas a esses sistemas, falamos sobre as vantagens e desvantagens de cada um deles, conhecemos a história do sistema de controle de versão Git.
