# CVS vs Git
## Breve explicação sobre as ferramentas

CVS
CVS é um acronimo para Concurrent Versions System (Sistema de Versões Concorrentes). É um sistema de controle de versões OpenSource e Multiplataforma. É um software de versionamento de código o qual utiliza uma arquitetura de Cliente-Servidor para armazenar as versões do projeto atual. Através da conexão ao servidor é possível obter uma cópia do projeto para realizar suas próprias alterações. Para cada alteração feita é criada um log indicando as modificações. Atualmente o CVS está ativo, entretanto sem novas funcionalidades.
CVS por ser um sistema centralizado, precisa de um servidor central ao qual os desenvolvedores precisam sincronizar-se para realizar as suas alterações e não é possível dar "checkouts" reservados. Também possui limitações para realizar commits mais frequentes. No geral funcionalidades inteiras são implementadas em um único commit.
A seguir são apresentados alguns dos conceitos básicos a respeito do CVS:
* Repositório:
Lugar onde ficam guardados os arquivos sob controle do CVS que compõem os diversos módulos. Um repositório pode ser local (armazenado na própria estação de trabalho) ou em um servidor remoto.
* Modulo:
Consiste em um conjunto de arquivos agrupados em pastas dentro de um repositório. Separação lógica dos arquivos de diferentes projetos, sob um mesmo repositório. Normalmente um por projeto ou sistema.
* Área de trabalho:
Local aonde se mantem os arquivos de um determinado módulo para que possam ser modificados.
Principais comandos do CVS:
* Checkout;
* Commit;
* Update;
* Merge;
* Diff;
* Release;
* Import;
* Export;
* Add;
* Rem;
* Status;
* Tag;
* Branch.
Git
É um software de versionamento de código o qual também usa uma arquitetura de cliente-servidor para armazenar versões do projeto. Diferente do CVS o git funciona sem um servidor central, permitindo aos desenvolvedores terem seus próprios repositórios enquanto há um repositório público o qual podem ser enviadas as alterações.
Sendo um sistema de controle de versão descentralizado commits podem ser feitos mais frequentemente, permitindo a implementação de funcionalidades através de diversos commits.

## Instalação do CVS no Linux pelo terminal

1º passo
Para mais informações de configuração acesse CVS

## Instalação do Git no Ubuntu

1º Passo

## Roteiro demonstrativo para uso em uma aplicação simples

No exemplo será suposto que se queira versionar todo o conteúdo existente no diretório Documents no linux Mint. Primeiramente deve se criar um repositório vazio. O nome do usuário é Kleber e o diretório sera criado com nome CVS. Digite o seguinte comando:
Será necessário redefinir a variável de ambiente CVSROOT para apontar para este diretório:
Inicialize o repositório para dessa forma instruir o CVS a criar um conjunto de arquivos de administração, para que se possa adicionar módulos em seguida:
Após este comando, o CVS criará um diretório chamado CVSROOT contendo os arquivos de que necessita para gerenciar o repositório (arquivos administrativos). O repositório já se encontra em condições de criar módulos e importar os respectivos arquivos.
Para criar um módulo no repositório, basta importar os arquivos desejados a partir do diretório raiz do projeto. Diretório raiz de um projeto é o diretório que contém todos os arquivos de um determinado projeto.
Criar o módulo versionamento importando os arquivos:
Sintaxe do comando:
$ cvs import módulo vendor_tag release_tag
* módulo indica o módulo que deve ser criado no repositório, se este ainda não existir.
* vendor_tag geralmente indica o distribuidor ou autor do projeto.
* release_tag indica o marcador que deve ser usado durante a importação dos arquivos.
Para modificar os arquivos de um módulo, devemos antes fazer uma cópia (checkout) do mesmo para a área de trabalho. No exemplo, o diretório ~/Desktop foi criado no diretorio Documents e escolhido como área de trabalho, a cópia do módulo será feita lá.
Para evitar que possíveis alterações sejam desfeitas, é importante atualizar os arquivos da área de trabalho antes de enviar as alterações para o repositório:
Quando se quer adicionar um arquivo a um módulo, é necessário adicioná-lo explicitamente, pois o CVS não adiciona ou remove arquivos automaticamente:
Realizadas as modificações necessárias, o próximo passo é enviá-las para o repositório com o seguinte comando:

## Significado dos Códigos de Saída

* U – mais comum, indica que o CVS atualizou (ou criou) um arquivo com
uma cópia completa do repositório;
* P – indica que o CVS atualizou um arquivo usando patch, ou seja, enviou
apenas as diferenças do repositório
* M – indica que o CVS detectou uma alteração na cópia local em relação
ao repositório
* C – indica que o CVS encontrou um conflito ao tentar mesclar as
atualizações do repositório com a cópia local
* R – arquivo local removido por não fazer mais parte do repositório
* N – arquivo local adicionado ao repositório
* ? - arquivo local que não foi encontrado no repositório, e, portanto, será ignorado

## Comparação de comandos CVS vs Git
### Alguns comandos Básicos CVS

Iniciar um repositório.
Criar novas branches Para criar novas branches em CVS deve-se primeiro ir ao diretório, ou parte do código que deseja, e comandar:
Para criar uma cópia do código nessa nova branch
Para ver a ajuda de um determinado comando:
O manual online do CVS possui bastante informação, com a vantagem de ter descrições mais longas (e úteis):
Para mostrar o log de alterações entre um determinado par de revisões (numéricas, não simbólicas)
Para exibir o status de um ou mais arquivos:
Para criar uma ramificação de um módulo retirado, usa-se o parâmetro -b (de branch) no comando CVS tag :
Unindo as ramificações
Commitando
Merge Pode-se utilizar os comandos co ou update seguidos de -j para fazer o merge das alterações da nova_branch para a branch principal.
Ou

### Comandos Básicos Git

Iniciar um repositório.
Vá no diretório que deseja iniciar um novo repositório e digite
Criar uma cópia do repositório
Atualizar o repositório local de acordo com o repositório remoto
Ver log de commits da branch atual
Verificar o status dos arquivos
Criar novas branchs
Merge Você deve ir para a branch que deseja incluir as alterações.
Por exemplo, uma branch feature1 contém alterações que podem ser incluídas na master.

### Git vs CVS

Armazenamento de dados
O CVS armazena informações como uma lista de mudança de arquivos. Enquanto o Git mantem um Snapshot, isso significa que o git salva o estado atual do projeto e armazena uma referência para essa captura.
Operações
A maior parte das operações em Git utilizam apenas de recursos locais, tornando assim o trabalho mais rápido, pois não há necessidade de uma rede ou computador para versionar seu projeto.
* Git não necessita acesso ao servidor para ter acesso ao histórico projeto.
* Git pode mostrar as diferenças num arquivo de modo local
* Caso não haja internet ou acesso ao servidor, ainda é possível trabalhar de maneira offline.
Gitignore
* Git possui uma ferramenta para ignorar automaticamente arquivos. Você pode adicionar as extensões ou arquivos que deseja ignorar no arquivo .gitignore.
Branching
* Operações de branching em CVS são penosas pois exigem que o repositório seja marcado em um determinado ponto, para que a branch seja criada e então o processo de desenvolvimento pode ser iniciado.
Processo tal que não é projetado para o uso de longo prazo das branches.
Enquanto no Git:
Fazendo o merge da nova_branch com a master
* CVS
* Git
Git blame e CVS Annotate Ambos, git e CVS, possuem uma ferramenta para mostrar o registro de modificações em um arquivo.
* Git
Para mais informações visite Git Debugging: blame e bisect
* CVS
Apesar de existir esse comando em ambos os softwares, o git oferece melhor uso ao permitir a escolha de linhas para ser analisado entre outros comandos úteis.
Comandos avançados em Git que não possuem similares em CVS
* CherryPick
acesse Comando Cherry-Picking para mais informações
* Git bisect
acesse Git Debugging: blame e bisect
* Git checkout [arquivo]