Usando o Git – parte 1

Git-1_readme-md

No início deste ano comecei a escrever algo sobre o Git, acabei atropelado com outras coisas e no final o texto acabou ficando de lado, mas não esquecido. Agora consegui tempo para voltar a trabalhar nele, ou melhor, retrabalhar pois acabei por repensá-lo como um “exercício” e não meramente uma lista chata das funções e opções que estão disponíveis na ferramenta.

Nesta primeira parte, o conceito mais importante, o fluxo de trabalho do Git. 🙂

O que é o Git?

De acordo com a Wikipédia em português o Git é:

(…) um sistema de controle de versão distribuído e um sistema de gerenciamento de código fonte, com ênfase em velocidade. O Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do kernel Linux, mas foi adotado por muitos outros projetos.

A definição está bastante simplificada mas é suficiente pois (1) basicamente é isto que o Git é mesmo; um sistema distribuído para controle de revisão em arquivos — por distribuído basta entender que não existe um repositório único que centraliza o trabalho –, e (2) em momento algum usa palavras como “equipe”, “grupo”,”time” etc, ou seja, ele também funciona para programadores individuais.

Mesmo sendo você a única pessoa a mexer no código, ele acaba sendo útil ao te ajudar a manter o controle das suas mexidas no código ao custo de alguma disciplina. Para ilustrar melhor, um exemplo fictício e que nunca aconteceu antes com ninguém:

Você passou a manhã inteira mexendo em algo que seria uma mera correção mas que no final virou uma refatoração de código que, claro, não mais funciona! Pior, agora nem está compilando! Como faz? Utilizar “Editar”→”Desfazer” e torcer para que se chegue até o estado original do arquivo? Recorrer ao arquivo com o sufixo “_está funcionado por favor não apague”? Correr atrás do backup? Espera, tem backup? Refazer do zero? Chorar?

Melhor usar o Git, não é mesmo?

Primeiros passos

É possível baixá-lo diretamente da página do projeto mas ele se encontra devidamente empacotado nas principais distribuições de GNU/Linux, nos ports-trees dos BSD ou em ferramentas equivalentes — Brew? Chocolatey? — de outros sistemas operacionais.

Mas para deixar tudo mais uniforme resolvi apelar para o Vagrant e então basta seguir o roteiro dos comandos:

$ mkdir -p ~/Vagrant/usando_o_git
$ cd ~/Vagrant/usando_o_git
$ vagrant init ubuntu/xenial64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
$ vagrant up --provider virtualbox
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/xenial64'...
...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...

Isto baixará a imagem (caso seja necessário), criará e colocará em execução uma máquina virtual com a versão 16.04 LTS do Ubuntu e para acessá-la use:

$ vagrant ssh
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-24-generic x86_64)
...
ubuntu@ubuntu-xenial:~$ git --version
git version 2.7.4

A parte boa é que ela já tem o Git instalado mas ainda falta deixá-lo minimamente configurado para uso. A primeira coisa a fazer é se identificar na ferramenta:

$ git config --global user.name "«meu nome»"
$ git config --global user.email "«meu e-mail de contato»"

Com o parâmetro “- – global” o Git se encarregará de guardar e usar esta configuração para todos os repositórios que forem criados neste usuário — precisando se identificar de forma diferente em um projeto basta usar estes mesmos comandos com o parâmetro “- – local” de dentro do repositório.

Algo bastante interessante de habilitar é isto aqui:

$ git config --global color.ui true

Ele habilitará o uso de cores na saída dos comandos do Git o que ajuda bastante a destacar as informações.

Agora já é possível começar! 🙂

Criando uma pastelaria

Hora de praticar criando um novo projeto, o “Pastelaria”, que é, claro, o cardápio de uma pastelaria escrita em Markdown. Ele é como a descrição do Git na Wikipédia lusófona, algo que é simples porém mais que suficiente para testar os comandos.

Criando e inicializando o repositório

A primeira coisa é criar um novo diretório para o projeto e dentro dele inicializar o repositório:

$ mkdir ~/pastelaria
$ cd ~/pastelaria
$ git init
Initialized empty Git repository in /home/ubuntu/pastelaria/.git/

O comando “init” criará a estrutura necessária para que o Git funcione, é aqui que ele armazenará as informações (ou metainformações ou objetos ou etc).

O cardápio básico

Agora podemos começar a acrescentar arquivos ao repositório e o primeiro será o «README.md»:

# Pastelaria

Conheça as opções do nosso cardápio!

## Pastéis salgados

Pastel de carne

Pastel de queijo

## Pastéis doces

Pastel de banana com canela

Pastel de chocolate

O nome “«README.md» é utilizado pelos serviços de repositório (Bitbucket, GitHub etc) para a descrição/página inicial do projeto. Funcionando tal qual o «index.html» nos servidores HTTP.

Um detalhe importante, o Git não armazena automaticamente as modificações nos arquivos. Ele sabe que arquivos estão sendo criados, modificados e até apagados mas só fará algo se você “mandar”. Na terminologia do Git os arquivos ainda estão no working directory, o diretório de trabalho.

Sendo assim é bom pedir pro Git que faça algo como nosso arquivo:

$ git add README.md
$ git commit -m "Abertura da pastelaria"
[master (root-commit) d30c664] Abertura da pastelaria
 1 file changed, 16 insertions(+)
 create mode 100644 README.md

Aqui estou executando duas operações — ou melhor, três mas já explico!

  • O “add” colocou o arquivo «README.md» (ou quaisquer outros arquivos e diretórios relacionados) na staging area.
    • Staging area ou index é um área temporária onde os arquivos vão sendo colocados de uma só vez ou individualmente.
  • O “commit” pegou o «README.md» na staging area, fez um instantâneo dele — um snapshot — e registrou tudo na HEAD. Repare o número d30c664, ele é a identificação desta revisão.
    • HEAD é a referência do Git para o branch atual do repositório.
    • O parâmetro “-m” e a mensagem são um breve descritivo sobre esta operação; se omitido o Git abrirá o editor de textos padrão para que você o escreva.
  • E como também foi executado o primeiro “commit” foi também criado o branch principal do repositório, o master — a tal da terceira operação.

O resultado final da operação pode ser visto no log do Git:

$ git log --decorate=short
commit d30c66499932c0ed8d734b814e0dac3422ebfc09 (HEAD -> master)
Author: Giovanni Nunes <░░░░░░░░░░░░░░@░░░░░░░░░>
Date:   Tue Jul 5 12:35:09 2016 +0000

    Abertura da pastelaria

Este é o fluxo de trabalho do Git: (i) você edita o arquivo na sua área de trabalho, (ii) coloca em “stage” e então (iii) faz o “commit” para guardar estas mudanças. Esta operação se repetirá diversas vezes. E sem um entendimento razoável sobre como ele funciona fica complicado entender operações mais sofisticadas como “cherry pick”, “merge” ou mesmo “rebase”.

Acrescentando pastéis

Agora o primeiro pastel, «pastel_de_carne.md»:

# Pastel de Carne

Pastel recheado com carne moída temperada com alho, cebola, salsa e
um leve toque de pimenta do reino.

__contém uma azeitona inteira com caroço__

## Veja também

[Pastel de Queijo](pastel_de_queijo.md)

O segundo pastel, o «pastel_de_queijo.md»:

# Pastel de queijo

Pastel recheado com uma generosa fatia de queijo minas frescal.

## Veja também

[Pastel de Carne](pastel_de_carne.md)

Mas antes de prosseguir uma olhada sobre como o Git está enxergando o estado atual do repositório:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    pastel_de_carne.md
    pastel_de_queijo.md

nothing added to commit but untracked files present (use "git add"
to track)

Ou seja, ele identificou a existência dos novos arquivos no working directory mas cabe a você decidir se irá acrescentá-los, ou não, ao repositório via “add” ou ignorá-los por enquanto ou por completo — acrescentando seus nomes dentro do arquivo «.gitignore» para que o Git deixe-os de lado.

Mas como eles devem fazer parte do repositório:

$ git add pastel_de_*.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   pastel_de_carne.md
    new file:   pastel_de_queijo.md

Mas é preciso referenciá-los também no «README.md». É preciso editá-lo também!

# Pastelaria

Conheça as opções do nosso cardápio!

## Pastéis salgados

[Pastel de carne](pastel_de_carne.md)

[Pastel de queijo](pastel_de_queijo.md)

## Pastéis doces

Pastel de banana com canela

Pastel de chocolate

A alteração é basicamente criar as ligações nos dois primeiros pastéis para suas respectivas descrições. E pronto!

Pronto? Não, veja o que o Git nos diz agora:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   pastel_de_carne.md
    new file:   pastel_de_queijo.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   README.md

O «README.md» foi modificado mas como você ainda pode estar editando o arquivo, gravou as alterações por acidente, etc o Git não fará nada automaticamente e esperará que você o mande fazê-lo… 🙂

Sendo assim é bom incluir as alterações do «README.md» também:

$ git add README.md 
$ git commit -m "pastéis de carne e queijo"
[master 08df860] pastéis de carne e queijo
 3 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 pastel_de_carne.md
 create mode 100644 pastel_de_queijo.md

E pronto, as alterações efetuadas foram incluídas na HEAD e seu trabalho está terminado, ou quase. 🙂

Fim desta parte

Neste momento já temos uma pastelaria com um cardápio que dispõe de quatro pastéis sendo dois deles (os salgados) com descrições em arquivos separados e outros ainda não (os doces). Ou seja, ainda há alguma coisa para fazer e na próxima parte seguiremos com a confecção do cardápio da pastelaria (só que acrescentando complexidade).

Ah sim, desconecte a sessão SSH e use vagrant halt para desligar a máquina virtual.

Anúncios

5 comentários sobre “Usando o Git – parte 1

  1. Pingback: Usando o Git, primeira parte - Linux em Ação XYZ

  2. Pingback: Usando o Git – parte 2 | giovannireisnunes

  3. Pingback: Usando o Git – parte 3 | giovannireisnunes

  4. Pingback: Autenticando no Git com SSH | giovannireisnunes

  5. Pingback: Jenkins – parte 2 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s