Git #3: Tags, Branches e comando remotos

Tempo de leitura: menos de 1 minuto

Git

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.

Explicação de como funciona um commit.
Na figura acima o commit é representado pela caixa verde, seu identificador único é o hashcode “98ca9..”. Um commit possui dados do autor, mensagem de comentário e uma tree apontando para cada um dos arquivos (blob).

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:

Branch master apontando para o último commit efetuado.
Na figura, podemos ver que o branch sempre acompanha o último commit efetuado.

 

Como criar um branch?

O comando para criar um branch é o seguinte:

[code language=”bash”]
$ git branch testing
[/code]

Novo branch "testing" apontando para o mesmo commit apontando pelo branch master.
Ao executar o comando a cima, criamos um brach chamado testing sobre o último commit.

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.

Ponteiro HEAD, indicando que a branch master, é o branch corrente
Na figura, podemos ver o ponteiro HEAD apontando para master, ou seja, master ainda é o branch corrente.

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.

Alteração o ponteiro HEAD do branch master para testing
Na figura, podemos ver que o ponteiro HEAD agora aponta para o branch 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:

Se gostaram curtam, comentem ou compartilhem!

Até a próxima.

Nenhum comentário


Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *