Usando o git

O Git é um sistema de controle de versões, assim como o Subversion. Só que, ao contrário deste, ele é distribuído. Ou seja, não há um servidor central. Cada cópia de um repositório contém tudo que há na origem. Assim, ela é também um repositório, onde você pode dar commits, criar branches, etc.. Para entender melhor, vamos ver como é o fluxo básico de trabalho com o git, usando o GingaJ-Emulator como exemplo.

Para este tutorial, consideramos que você já instalou o git e o estará usando pela linha de comando.

Configurando o git

Nome e e-mail

No git, o formato do nome do autor de cada commit é, a semelhança de um e-mail, no formato "PrimeiroNome SobreNome <>". Para configurar isto, você precisa digitar em um terminal:

$ git config --global user.name "PrimeiroNome SobreNome" 
$ git config --global user.email "voce@seudominio.com.br" 

Para checar se as alterações tiveram sucesso, faça:

$ git config -l
user.name=PrimeiroNome SobreNome
user.email=voce@seudominio.com.br

Liberando acesso de escrita

Para conseguir ter acesso de escrita aos repositórios do GingaCDN, você precisa gerar um par se chaves RSA. Para isto, execute:

ssh-keygen -t rsa (Aceite as opções padrão)

Envie a sua chave pública, que está em ~ /.ssh/id_rsa.pub (onde "~" representa o diretório home de seu usuário), junto com seu nome completo e instituição para . Faça backup dos arquivos:

~/.ssh/id_rsa
~/.ssh/id_rsa.pub

É a partir deles que você tem acesso ao servidor. Devem seguir a mesma política de segurança que você trata suas senhas. Caso você queira acessar de outra máquina, deve copiá-los para ela, colocando nesse mesmo diretório.

Baixando o código do repositório

As duas formas mais usadas de pegar o código de um repositório git é usando o protocolo deste ou o do SSH. No GingaCDN usamos o protocolo do git para acesso anônimo, onde você não tem acesso a escrita no servidor, e o do SSH para acesso autenticado.

Caso você tenha enviado a chave do passo anterior e seu usuário já tenha sido criado, você pode baixar o código de, por exemplo, o gingaj-emulator usando:

$ git clone git@dev.openginga.org:gingaj-emulator.git

Caso contrário, você poderá baixar anonimamente usando:

$ git clone git://dev.openginga.org/gingaj-emulator.git

Perceba a diferença no endereço. Em um, usamos :gingaj-emulator.git (usando arroba e dois pontos) e, no outro, semelhante a URL de um site, git://dev.openginga.org/gingaj-emulator.git (com git:// e barra).

Neste momento, você terá uma pasta gingaj-emulator com todo o repositório. Vamos entrar nela para ver.

$ cd gingaj-emulator
$ ls
config  img  jars  legal  LICENSE  README  src

Commitando

Vamos modificar o arquivo src/SimpleXletLWUIT.java para ver como dar commit.

$ vi src/SimpleXletLWUIT.java
// Faça alguma alteração e salve

Para checar se houve a modificação, vemos o status do repositório
$ git status
# 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:   src/SimpleXletLWUIT.java
#
no changes added to commit (use "git add" and/or "git commit -a")

Houve uma modificação. Vamos ver o que foi modificado.
$ git diff
diff --git a/src/SimpleXletLWUIT.java b/src/SimpleXletLWUIT.java
index 0208f9f..95ec19c 100644
--- a/src/SimpleXletLWUIT.java
+++ b/src/SimpleXletLWUIT.java
@@ -94,7 +94,7 @@ public class SimpleXletLWUIT implements Xlet, UserInputEventListener, ScarceReso
     }

     public void initXlet(XletContext xletContext) throws XletStateChangeException {
-        System.out.println("begin initXlet.");
+        System.out.println("início do initXlet.");
         context = xletContext;
     }

Tudo certo. Vamos ao commit.
$ git commit src/SimpleXletLWUIT.java -m "Traduz 'begin initXlet' como 'início do initXlet'" 
[master 66ef90d] Traduz 'begin initXlet' como 'início do initXlet'
 1 files changed, 2 insertions(+), 2 deletions(-)

Caso haja mais de um arquivo que você queira dar commit, pode ou listar todos na linha de comando ou usar "git commit --all".

Vamos usar o git log para checar se o último commit foi esse.

$ git log
commit 66ef90dfb046b38c4d2d7382ea9eadd9e286f298
Author: PrimeiroNome SobreNome <voce@seudominio.com.br>
Date:   Mon Dec 21 17:42:12 2009 -0300

    Traduz 'begin initXlet' como 'início do initXlet'

// Continua com o restante das mensagens de commit
// ...

Tudo certo. Só lembrando que este commit é local. Ou seja, você está dando um commit no repositório que está na sua máquina. Essas mudanças não estão no servidor.

Baixando as atualizações do código

Depois de algum tempo, é possível que outras pessoas tenham enviado modificações para o servidor do git. Para pegá-las, faça:

$ git pull
Already up-to-date.

Neste caso, não existem modificações no servidor. Nosso código é o mais atual.

Enviando nossas alterações de volta a origem (só para quem tenha permissão de escrita)

Tenha sempre em mente que, pelo Git ser distribuído, não há o conceito de um servidor centralizado. Quando você executa o git clone em um repositório, o git se lembra dele como a origem. Ela pode ser o servidor do GingaCDN, o computador de um colega, ou até um outro repositório em sua máquina. Eles são chamados repositórios remotos, da onde você pode baixar e, se tiver permissões, enviar mudanças. Podemos ver uma lista deles usando:

$ git remote -v
origin    git@dev.openginga.org:gingaj-emulator.git

O nome a esquerda é o "apelido" do repositório, e o a direita é o caminho para ele. Usamos o -v só para obtermos mais informações. Quando se sentir mais confortável com o git, recomendamos a leitura do manual do git remote. É muito útil em diversos cenários.

Enfim, só recapitulando o que vimos até agora: demos clone em um repositório, alteramos e demos commit nele localmente, baixamos quaisquer mudanças que possam ter ocorrido na origem, e agora queremos enviar nossas modificações para lá. Para isto, basta:

$ git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 401 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
To git@dev.openginga.org:gingaj-emulator.git
   462ac97..4716008  master -> master

Links

Este é um tutorial básico de uso do git. Você não deve se limitar ao conhecimento que está aqui. Recomendamos, principalmente a quem vem do SVN, a leitura do Git-SVN Crash Course, que compara diversos comandos do SVN e do Git.