Tempo de leitura: menos de 1 minuto

Continuando a saga Git, nos posts anteriores, falamos um pouco sobre como o Git funciona e as diferenças de repositórios centralizados e distribuídos (Git #1: Por onde começar), em seguida colocamos a mão na massa, foi apresentados os principais comandos, aqueles que usamos no dia a dia (Git #2: Principais comandos do dia a dia).
Para finalizar a saga, falaremos hoje sobre tags, branches e comandos utilizados para sincronizar repositório local e remoto.
Tags
Criando tags
O Git possibilita a criação tags de três formas diferentes:
- Tag leve: funciona como um ponteiro para um commit específico.
- Tags anotadas: são armazenadas como objetos inteiros no banco de dados do Git
- Tags assinadas: você pode assinar suas tags com GPG, assumindo que você tenha uma chave privada
Exemplo Tag Leve:
[code language=”bash”]
$ git tag <nome da tag>;
[/code]
Exemplo Tag Anotada:
[code language=”bash”]
$ git tag –a <nome da tag> –m “minha versão 2.0.0”
[/code]
Exemplo Tag Assinada:
[code language=”bash”]
$ git tag –s <nome da tag> –m “minha versão assinada 2.0.0”
[/code]
Listando Suas Tags
Para saber / listar as tags de seu repositório local basta:
[code language=”bash”]
$ git tag
v0.1
v0.2
[/code]
Nota: A tags são listadas em ordem alfabéticas.
Também é possível procurar tags por uma nomenclatura em particular:
[code language=”bash”]
$ git tag –l ‘v1.2.1*’
[/code]
Branches
O que é um Branch
Para compreender realmente a forma como o Git cria branches, precisamos entender os commits. Quando efetuamos um commit, o Git guarda um objeto contendo um link para o snapshot. Cada snapshot possui um hashcode (usado como identificador do commit), autor do commit, mensagem e o link para os arquivos referentes, conforme figura abaixo.

No Git, um branch é simplesmente um link para um determinado commit.
O branch principal no Git chama-se master. Na teoria, a branch master, deveria guardar o código fonte mais estável de uma aplicação, aqui na minha equipe o master, deve conter apenas evolução do produto, correção são feitas em outra branch, normalmente originada de uma tag publica.
Suponha que já existe vários commits em nossa aplicação, provavelmente nosso branch principal (master) deve estar apontando para o último commit. Cada vez que um commit é efetuado o ponteiro da branch avança automaticamente.
Na figura abaixo podemos ver um branch (master) apontando para o histórico de commits:

Como criar um branch?
O comando para criar um branch é o seguinte:
[code language=”bash”]
$ git branch testing
[/code]

O branch testing que acabamos de criar, agora aponta para o mesmo snapshot do branch master.
Nota: O branch sempre é criado sobre o branch corrente. Antes de criar um branch certifique-se que será criado sobre o correto, para isso uso o comando “status”, ele te informará qual é o branch atual.
Listando os branches existentes
Para listar os branches criados basta:
[code language=”bash”]
$ git branch
[/code]
Como o Git sabe o branch em que você está atualmente?
Ele mantém ponteiro especial chamado HEAD. Observe que isso é muito diferente do conceito de HEAD em outros VCSs como Subversion e CVS. No Git, HEAD é um link para o branch corrente, pode ser a master ou qualquer outro branch que você tenha criado.
Na figura abaixo, o branch atual ainda é o master.

Nota:O comando branch apenas cria um novo branch, a branch master ainda é a corrente.
Trocando de branch
Para trocar de branch, eis que uma nova função para o comando checkout é revelada. Vejamos:
[code language=”bash”]
$ git checkout testing
[/code]
Ao usar esse comando o ponteiro HEAD deixa de apontar para o branch master e passa apontar para testing.

É possível criar e trocar de branch em um único comando, para isso usamos um parâmetro especial do comando checkout:
[code language=”bash”]
$ git checkout -b <nome da nova branch>
[/code]
Merge
Cria um novo branch para correção de um bug, após corrigido precisamos fazer o merge entre a branch origem e a nova. Para isso usamos o comando merge, veja:
[code language=”bash”]
$ git checkout master
Switched to branch ‘master’
$ git merge testing
[/code]
Nota: o merge normalmente é feito “trazendo” as alterações feitas no novo branch para o branch destino, no exemplo acima retornamos para o branch master (usando o comando checkout), depois o comando merge, para trazer as alterações feitas no branch testing para o master.
Para mais informações sobre merges consulte o guia Pro Git.
Trabalhando com repositórios remotos
Exibindo seus remotos
Para ver quais servidores remotos estão configurados, usamos:
[code language=”bash”]
$ git remote -v
origin git@git@github.com:edermfl/TestGit.git (fetch)
origin git@git@github.com:edermfl/TestGit.git (push)
[/code]
Nota: A palavra origin é o nome padrão que o Git dá para o repositório no servidor de onde você fez o clone.
Adicionando Repositórios Remotos
[code language=”bash”]
$ git remote add <nome_curto> <url_repo_git>
[/code]
Comando: fetch
Fetch é usado para “baixar” dados de um projeto remoto. O comando usado é:
[code language=”bash”]
$ git fecth <nome_curto ou url_repo_git>
[/code]
Importante: o comando fetch traz os dados para o seu repositório local, ele não faz o merge automaticamente com o seus dados ou modifica o que você está trabalhando atualmente. Você terá que fazer o merge manualmente.
Comando: pull
O comando pull é parecido com o comando fetch, a grande diferença é que o pull automaticamente tenta fazer o merge dos dados “baixados” com o código que você está trabalhando atualmente.
[code language=”bash”]
$ git pull <nome do repositório> <nome do branch>
[/code]
Nota: Caso o pull não consiga fazer o merge automático, o git gerará um conflito, que deve ser resolvido manualmente. Cada pull que necessite de um merge, quando bem sucedido gera um novo commit. No caso que o merge deve ser resolvido manualmente, será necessário fazer um commit também manualmente.
Comando: push
O comando push é responsável por enviar os commits do repositório local para o repositório remoto. Sua escrita é similar ao pull, veja:
[code language=”bash”]
$ git push <nome do repositório> <nome do branch>
[/code]
Nota: O push só funciona se ninguém mais enviou dados no meio tempo. Se alguém do projeto tiver enviado algum commit antes do seu, seu push será rejeitado, necessitando fazer o merge novamente executando o comando pull.
Apagando uma Tag
As vezes temos a necessidade de apagar uma tag, seja por que erramos o nome da tag na criação ou por qualquer outro motivo. Para usamos:
[code language=”bash”]
git tag -d <nome da tag>
[/code]
Nota: Esse comando remove apenas a tag do repositório local.
Para remover a tag do servidor remoto execute o seguinte comando:
[code language=”bash”]
git push origin :refs/tags/<nome da tag>
[/code]
Conclusão
É isso aí pessoal, depois de uma semana, concluimos o assunto Git, espero que vocês tenham gostado.
Abaixo deixo alguns links para referencias:
- Livro Pro Git – https://git-scm.com/book/pt-br/v1.
- Git Cheatsheet – http://ndpsoftware.com/git-cheatsheet.html
- Escapando de um besteira, step-by-step – http://justinhileman.info/article/git-pretty/git-pretty.png
Se gostaram curtam, comentem ou compartilhem!
Até a próxima.
Link permanente