Se você já desenvolveu mesmo que fosse um pequeno sistema que precisou ser modificado com uma certa frequência ao longo de um tempo sabe que manter um controle sobre as alterações é necessário e bem difícil, principalmente se existe vários desenvolvedores mexendo no código.

Um Sistema de Controle de Versões(CVS) nada mais é do que um software que possui a responsabilidade de gerenciar as versões de arquivos em um diretório ou remotamente, ele permite saber quais foram as alterações que um arquivo sofreu e quem as fez e permite, se necessário, reverter o arquivo a uma versão anterior ou criar uma ramificação do software(branch), para o desenvolvimento de uma versão alternativa.

Atualmente um CVS que está com bastante enfoque é o GIT, que é um controle de versões distribuídos que foi desenvolvido por ninguém menos que Linus Torvalds para controlar as versões do Kernel do Linux.

Primeiramente para utilizarmos o GIT precisaremos instalá-lo. No Debian/Ubuntu utilizamos o seguinte comando:

apt-get install git

Para começar precisamos inicializar o diretório que irá conter os arquivos que iremos controlar.

mkdir teste
cd teste
git init

Ao executar o comando acima será criado um diretório .git que irá conter as informações de versionamento de seus arquivos.

Agora criamos um arquivo, como por exemplo boteco.php com, digamos o seguinte conteúdo:

<?php
echo "O Boteco Digital é o melhor";
?>

Agora se executarmos o seguinte comando:

git status

Será apresentada a mensagem abaixo informando que existem arquivos que não estão sendo rastreados, ou seja não estamos controlando suas versões.

# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       boteco.php
nothing added to commit but untracked files present (use "git add" to track)

Conforme as instruções da mensagem devemos adicionar nosso arquivo com o comando:

git add boteco.php

ou podemos incluir todos os arquivos da pasta com o “.”

git add .

Só lembrando para cada arquivo que criarmos devemos adicioná-lo com o comando acima.

Agora se executarmos git status veremos que uma mensagem dizendo que já possuímos alterações para serem gravadas(commitadas?).

# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   boteco.php
#

Então vamos “commitar” as alterações

git commit

Será aberto um editor onde devemos colocar a mensagem do commit, normalmente é colocada uma mensagem sucinta do que foi feito no commit, como adicionada funcionalidade tal, corrigido bug tal etc.

Se tentar agora executar o git status receberemos a mensagem de nothing to commit (working directory clean) dizendo que não há alterações para gravar. Então vamos agora acrescentar algumas modificações no arquivo botecco.php.

<?php
        echo "O Boteco Digital é o melhor";
        echo "Acesse agora http://www.botecodigital.info";
?>

Agora se executarmos o comando git status veremos a mensagem abaixo:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   boteco.php
#
no changes added to commit (use "git add" and/or "git commit -a")

Indicando que o arquivo arquivo foi alterado, podemos ver as alterações através do seguinte comando:

git diif

Será mostrada a seguinte mensagem:

diff --git a/boteco.php b/boteco.php
index cb1ff53..f35078e 100644
--- a/boteco.php
+++ b/boteco.php
@@ -1,3 +1,4 @@
 <?php
        echo "O Boteco Digital é o melhor EVER";
+       echo "Acesse agora http://www.botecodigital.info";
 ?>

Como podemos notar a linha que foi adicionada está marcada com “+” . Para complicar um pouquinho vamos modificar uma linha do arquivo boteco.php

<?php
        echo "O Boteco Digital é o melhor, NOT";
        echo "Acesse agora http://www.botecodigital.info";
?>

E executamos novamente o comando git diff

diff --git a/boteco.php b/boteco.php
index cb1ff53..f680ac6 100644
--- a/boteco.php
+++ b/boteco.php
@@ -1,3 +1,4 @@
 <?php
-       echo "O Boteco Digital é o melhor";
+       echo "O Boteco Digital é o melhor, NOT";
+       echo "Acesse agora http://www.botecodigital.info";
 ?>

Como podemos ver ele informa que a linha marcada com “-” foi retirada e duas adicionadas.

Agora temos modificações em nosso arquivo vamos “commita-lo

git commit -a

Deve ter notado o “-a” ele adicione automaticamente todo arquivo que foi modificado para ser “commitado”.

Temos agora 2 commit então vamos listá-los como o comando:

git log

A saída será:

commit 49c9cfe97a5430c6af1052063294e125d9f8b661
Author: rodrigo <rodrigo@galatica.(none)>
Date:   Wed Sep 7 00:20:50 2011 -0300
 
    adicionada URL e correção de mensagem
 
commit 84e387ef6cec8f6e2c1104cb7b59d875e728b40f
Author: rodrigo <rodrigo@galatica.(none)>
Date:   Tue Sep 6 23:28:54 2011 -0300
 
    commit inicial

Como vemos ele nos lista dois commits cada um com seu identificador(ele é importante para várias funções), o autor, data e a mensagem de commit. Isso já pode fornecer valiosas informações de histórico.

Agora podemos ver quais foram as modificações de um commit em relação ao outro, como no caso:

git diff 84e387ef6cec8f6e2c1104cb7b59d875e728b40f 49c9cfe97a5430c6af1052063294e125d9f8b661

ou somente um único arquivo:

git diff 84e387ef6cec8f6e2c1104cb7b59d875e728b40f 49c9cfe97a5430c6af1052063294e125d9f8b661 boteco.php

Podemos também reverter um arquivo depois de alterá-lo ao estado que estava no ultimo commit, por exemplo se alterarmos o arquivo boteco.php para deixá-lo como esta abaixo:

<?php
        echo "O Boteco Digital é o melhor EVER";
        echo "Acesse agora http://www.botecodigital.info";
        echo "Pena que não atualizam!!!"
?>

Se quisermos descartar estas alterações e deixar o arquivo como estava no ultimo commit basta executar o comando abaixo:

git checkout boteco.php

Também é possível voltar ao um commit anterior apenas informando o identificador do commit no comando:

git checkout 84e387ef6cec8f6e2c1104cb7b59d875e728b40f boteco.php

No caso revertemos um único arquivo ao um estado anterior, mas podemos reverter todas o diretório a um determinado commit simplesmente não informando o arquivo.

git checkout 84e387ef6cec8f6e2c1104cb7b59d875e728b40f

Lembrando que ao executar o comando acima será perdido todos os commit desde o atual até o especificado, então se você deseja apenas visualizar ou fazer algum teste é recomendável fazer um branch(ramificação) .

Para aquele que preferem estudar as alterações em um janela recomendo o programa GITK que pode ser instalado facilmente com o comando:

apt-get install gitk

para utilizá-lo basta executar o comando gitk em um diretório que esta sendo controlado.

GITK
GITK

Bom pessoal esse foi o básico do básico do GIT, ele permite bem mais talvez aborde um pouco mais em um post futuro, ou não. Mas gostaria de deixar uma boa referência que pode ser vista aqui, outra boa referencia sobre CVS é uma série de podcast do Grok Posdcast fez a algum tempo que ficou muito boa, nota 10 ouçam!