Você está na página 1de 24

Introduo

Embora as explicaes dentro do tutorial possam ser o suficiente se voc ainda no sabe
o que um Sistema de Controle de Verso recomendo a leitura desse tutorial Como
funcionam os Sistemas de Controle de Verses.
O Git um Sistema de Controle de Verso Distribudo criado por Linus Torvalds para o
desenvolvimento do Kernel Linux que acabou sendo adotado pela imensa comunidade do
mundo Open Source, contando com um servio gratuito na web o Github onde voc
encontra uma srie de projetos disponveis e onde voc pode colocar seus projetos e
compartilhar eles com o seus colegas ou mesmo com mundo.
Os passos desse tutorial foram criados para serem usados em um ambiente Linux, mas,
nada impede que voc adapte para outros ambientes.

Preparando o ambiente de trabalho do tutorial


Antes de iniciarmos o tutorial para valer crie um diretrio na sua home:
mkdir ~/git-tutorial-1
e crie um outro diretrio frutas dentro do diretrio git-tutorial-1:
mkdir ~/git-tutorial-1/frutas
A criao desses dois diretrios importante para que possamos l na frente estudar as
operaes de clonagem, push e pull do Git.
Agora vamos inserir dois arquivos de texto no nosso diretrio frutas, abra o seu editor de
textos favorito e crie o arquivo frutas.txt com o texto abaixo:
Abacate
Morango
Goiaba
e crie tambm o arquivo tropicais.txt com o texto:
Abacate
Goiaba
Mais um detalhe as estruturas de comando que eu vou mostrar usam o seguinte padro o
que estiver dentro de <> obrigatrio e o que estiver dentro [ ] opcional.

Instalando o git
Para instalar o Git no Debian, Ubuntu e derivados simplesmente abra o terminal e digite:
sudo apt-get install git
No CentOS, Fedora e derivados:
sudo yum install git
Para instalar no Windows aconselho esta pgina Git for Windows

Cofigurando o Git
Depois de instalado o Git precisamos definir as sua configuraes. O Git permite que voc
faa configuraes globais e configuraes locais as configuraes globais so aquelas
que sempre sero usadas quando no existir uma configurao local. Uma configurao
local feita dentro do repositrio Git sem a opo global.
A primeira configurao global que vamos fazer o nome de usurio, lembrando e claro
que no lugar de Seu Nome voc dever colocar o seu prprio nome e entre aspas
podendo ser simples ou duplas:
git config global user.name <Seu Nome>
A prxima configurao e o seu e-mail:
git config global user.name <seu email>
no caso do e-mail no se exige as aspas.
A prxima configurao e uma questo de gosto pessoal, ns vamos configurar o editor
de textos do Git, por padro o Git vem com o Vi, mas, se voc no f do Vi pode alterar
isso dando o seguinte comando:
git config global core.editor <seu-editor-de-textos>
onde seu-editor-de-textos pode ser o Nano, Gedit, Geany. Por exemplo configurando o
Geany como seu editor:
git config --global core.editor geany
eu testei todos os trs editores e eles funcionam bem com o Git, o Atom requer uma
entrada a mais como mostrado abaixo:
git config --global core.editor "atom wait"
se voc no for usar nenhum editor de textos pelo terminal, como Vi ou o Nano,
aconselho a verificar como colocar ele para funcionar com o Git.
Todas as configuraes do Git se encontram no arquivo .gitconfig no seu diretrio home,
este um simples arquivo texto que voc pode editar diretamente, mas, eu no
recomendo isso.

Pedindo ajuda ao Git


Se precisar de mais informaes sobre o comando git config, basta pedir ajuda ao prprio
Git atravs do comando:
git help config
O comando git help serve para tirar duvidas de quaisquer outros comandos atravs da
sintaxe:
git help [comando]

Iniciando o Git
Mova-se pelo terminal at o diretrio frutas:
cd ~/git-tutorial-1/frutas
Agora vamos iniciar o nosso repositrio Git dentro do diretrio:
git init

Figura 1
Como voc pode ter notado na mensagem aps o comando acima, figura 1, nosso
repositrio Git inicia vazio mesmo que nosso diretrio frutas possua dois arquivos, isso
porque ainda no adicionamos nada para o Git monitorar. Cada arquivo no Git pode ter
dois status monitorado e no monitorado.
De o comando:
git status
O comando git status compara o estado do repositrio Git com a rea de trabalho atual.
Ele permite que voc veja quais mudanas foram realizadas e que arquivos no esto
sendo monitorados pelo Git.

Figura 2
Como voc pode ver na figura 2 acima o git status ns informa em que ramo (branch)
estamos no caso no ramo master e mostra os arquivos que no esto sendo monitorados
pelo Git. O prprio Git ns da uma dica do que fazer use o git add to registrar a traduo
saiu meio falha, mas, ela mostra um comando que vamos usar agora o git add cuje a
estrutura bsica :
git add <[opes] [nome do arquivo 1 nome arquivo 2 ]>
Para adicionarmos nossos arquivos no terminal digite:

git add frutas.txt tropicais.txt


Agora voc poderia dar um novo git status e verificar se os arquivos esto sendo
monitorados como na figura 3:

Figura 3
Agora com o nossos arquivos sendo monitorados podemos ir para o nosso commit.

O Commit
O commit razo se ser dos Sistemas de Controle de Verso:
Um commit como se voc fizesse uma copia atual de todo o diretrio e arquiva-se essa
copia junto com um ndice nico de referencia a esse commit e uma copia do ndice nico
do commit anterior (somente o primeiro commit no possui uma referencia a um commit
anterior) em um banco de dados. Fazendo isso cada commit fica com uma referencia ao
commit anterior isso cria uma estrutura de um grafo direcionado que comea no primeiro
commit caminhando at o atual, figura 4.

Figura 4
O comando para realizar o commit :
git commit [opes]
Agora vamos realizar nosso primeiro commit:

git commit -m 'Primeiro Commit'

Usamos a opo -m nesse commit essa opo permite que voc insira uma nica linha na
mensagem do commit sem a necessidade do editor de textos. Aqui ns usamos essa
opo pois o primeiro commit um commit especial, ele no carrega nenhuma mudana,
portanto no precisamos de uma mensagem de commit extensa ns s avisamos que
estamos iniciado o nosso repositrio Git.

Figura 5
Vamos modificar um pouco nossos arquivos para criarmos um novo commit.
No arquivo frutas.txt vamos remover o morango (informao intil: em termos cientficos
no se pode considerar o morango um fruto j que constitudo pelo receptculo de flor
original (composta), em volta do qual se dispem os frutos) e colocar trs novas frutas:
Abacate
Goiaba
Laranja
Limo
Banana
no arquivo tropicais.txt vamos adicionar a nossa banana:
Abacate
Goiaba
Banana
De agora um comando git status o resultado deve se parecer com a figura 6 abaixo:

Figura 6

Na figura 6 acima aparece uma mensagem informando que o arquivos frutas.txt e


tropicais.txt foram modificados que voc dever usar o comando git add novamente
para que as mudanas faam parte do prximo commit. Pedir que voc adiciona
novamente arquivos que j esto sendo monitorados uma particularidade do Git, que
pode por exemplo ajudar voc a fazer commits mais organizados. Imagine que voc fez

alteraes substancias em dois arquivos do seu aplicativo, voc pode querer fazer um
commit diferente para cada arquivo descrevendo sucintamente cada alterao.
Vamos usar o exemplo que eu descrevi acima e fazer um commit diferente para cada um
dos nossos arquivos. Primeiro voc adiciona o arquivo frutas.txt e realiza o commit:
git add frutas.txt
git commit
Agora sem a opo -m o Git abre o editor de textos para que voc entre com a sua
mensagem de commit, podendo ser como a da figura 7:

Figura 7

Um padro usado para as mensagens de commit que a primeira linha seja um breve
descritivo sobre as mudanas ento voc pula uma linha e escreve mais detalhadamente
o porqu desse commit. Isso fica semelhante a uma mensagem de e-mail com o assunto
seguido da mensagem e facilita a leitura para voc e outras pessoas.
Voc agora salva a mensagem do commit fecha o seu editor de textos (no adianta voc
s salvar o texto voc tem que fechar o editor) e se tudo correu bem no terminal surge a
sada do comando na figura 8:

Figura 8

Vamos dar continuidade e adicionar agora nosso arquivo tropicais.txt:

git add tropicais.txt


Aqui vamos dar um commit meio desleixado usando a opo -m para pular logo para a
nova etapa desse tutorial:
git commit -m Alterado o arquivo tropicais.txt

Vendo o Histrico dos Commits


O principal comando para verificar o histrico de todo o repositrio :
git log [opes]
Apesar do comando ter tem uma srie de opes para gerar sadas do histrico do
repositrio, vamos primeiro ver sua sada sem nenhuma opo:
git log
sua tela do terminal deve se assemelhar a figura 9:

Figura 9

A primeira informao que o git log ns fornece o ndice nico do commit, seguido pelo
autor, pela data e por ltimo a mensagem. Ateno os seus ndices certamente iro ser
diferentes, se no forem me avise imediatamente para que eu possa jogar na Mega-Sena.
O ndice nico do commit uma string de 40 caracteres gerada por um hash SHA-1. O
SHA-1 um algoritmo e o que ele faz levar os dados pertencentes ao commit como
entrada e gerar uma sequncia de 40 caracteres exclusivo dessa entrada. Todos os
objetos do Git como arquivos, diretrios, commits contem um ndice nico gerado pelo

SHA-1. Isso garante que nenhum bit possa ser alterado em um dos seus objetos sem que
o Git no saiba, por exemplo se voc alterar uma nica virgula em um arquivo no
repositrio do Git ele saber que aquele um arquivo diferente do anterior.
Vamos agora gerar uma sada mais compacta do git log com a opo oneline:
git log oneline

Figura 10

Na figura 10 podemos ver que com a opo oneline o Git coloca como era de se
esperara cada commit em uma linha e simplifica o valor do ndice de cada commit
mostrando apenas os sete primeiros nmeros. Essa Opo tambm s mostra a primeira
linha de cada mensagem e omiti a data e autor do commit.
Voc pode criar seus prprios formatos de sada usando a opo format, se voc sabe C
esta opo muito semelhante a printf, na figura 11 voc v um pequeno exemplo do uso
de format:
git log - -format='%h | %an | %s'

Figura 11

Abaixo alguns valores que voc pode usar junto com format:

%H: commit hash


%h: abbreviated commit hash
%P: parent hashes
%p: abbreviated parent hashes
%an: author name
%ae: author email
%ad: author date
%cn: committer name
%ce: committer email
%cd: committer date

mais valores em: https://git-scm.com/docs/pretty-formats

Refazendo Commits
Aqui o primeiro commit que vamos refazer o ultimo que foi feito as pressas usando a
opo -m e agora queremos colocar mais informaes nesse commit, para isso vamos
usar o comando:
git commit amend
A opo amend mostrara a mensagem do commit anterior para edio, voc ento edita
o commit anterior e cria um novo commit. Isso mesmo criado um novo commit lembrese que cada commit usa um hash SHA-1 com base no que ele contm ento quando voc
modifica algo gerado um novo hash para um novo commit.
Nosso novo commit dever ficar assim:

Figura 12
Pronto um commit muito mais informativo:
de agora um comando:
git log oneline
na figura 13 mostramos a sada desse comando:

Figura 13

A grande diferena entre esse git log e o que realizamos anteriormente que o valor do
ndice de nosso ltimo commit foi alterado. Ateno os seus valores de ndice devem
diferir dos meus por causa de uma srie de detalhes.
Uma coisa que o Git faz que ele mantm todos os seus objetos, querendo voc ou no,
se tiver saudades do seu commit anterior podemos dar um:
git reflog

Figura 14
A figura 14 ns mostra todos os nossos commits inclusive que no mostrado com git
log. O que o reflog nos mostra e toda uma sequncia de comandos dados no nosso
repositrio.
Ns agora queremos voltar a um commit anterior a ltimo commit quando alteramos o
arquivo frutas.txt e inserir o nome das frutas adicionadas ao arquivo. Lembra-se da
mensagem desse commit se no pegue o ndice dele no meu caso 0ff3a43 e de o
seguinte comando:
git show 0ff3a43

Figura 15

Este comando ns traz toda a informao relevante desse commit inclusive um diff entre o
que foi modificado nesse commit. Como voc pode ver eu s coloquei na mensagem que
Foram inseridas trs frutas sem mencionar quais.
O problema aqui que para resolver isso eu tenho que voltar dois commits para trs e
comando git commit amend s volta ao commit imediatamente anterior ao estagio atual.
Para solucionar esse problema precisamos usar outro comando o:
git rebase [opes]
da seguinte forma:
git rebase -i HEAD~n
A nica informao que precisamos aqui quantos commits ns vamos voltar para
substituir esse valor pelo n ali em cima.
Vamos entender um pouco o HEAD ele uma especie de ponteiro que normalmente
aponta para a ponta de um branch, isso um commit a se realizar, no nosso caso ele
aponta para o branch master visto que ainda no criamos nenhum outro branch. O que o
comando acima faz e mover esse ponteiro um commit por vez de acordo com o nmero
(n) fornecido, permitindo voc editar cada commit conforme vai percorrendo os mesmos.
Ento o que temos aqui que o HEAD vai de master passa pelo commit que acabamos
de alterar e vai para o commit que queremos alterar. HEAD ento precisa retornar 2
commits, de uma olhada na figura 16:

git rebase -i HEAD~2


Ao dar o comando acima o Git abra o editor de textos e apresenta uma descrio de uma
linha de cada commit pelo qual vamos passar:

Figura 16
Agora na frente de cada descrio do commit temos um comando que diz o que o Git
deve fazer ao passar por cada commit, esses comados podem ser vistos na tabela
abaixo:
p

pick

No altera nada.

reword

Altera a menssagem do commit.

squash

Faz com que esse commit se una ao anterior, voc deixa um


commit como pick e um ou mais com squash eles iro se unir em

um nico commit e as sua mensagens so unidas tambm para


que voc possa edit-las.
f

fixup

O mesmo que squash s que descarta a mensagem desse


commit.

edit

Aqui voc pode editar o commit inteiro, colocando um novo


arquivo ou refazendo um arquivo depois voc usa o git commit
amend para refazer o commit e git rebase continue para
continuar a operao de rebase.

Para cada um desses comandos voc pode usar o nome completo ou somente a letra
inical.
Aqui um aviso cuidado ao editar esse arquivo pois ele mostra os commits na ordem
inversa do comando git log.
Vamos alterar o arquivo da figura 16 para ficar como na figura 17:

Figura 17
Aqui usamos pick no commit Alterado o arquivo tropicais.txt porque no queremos
mexer nele e reword para s alterar a mensagem o commit Alterado o arquivo frutas.txt.
Agora salve o arquivo e feche ele logo aps ir aparecer a mensagem que queremos
alterar:

Figura 18
Devemos deixar ele assim:

Figura 19
Aqui vamos alterar novamente o nosso arquivo frutas.txt colocando duas frutas
controversas pepino e tomate no final dele:
Abacate

Goiaba
Laranja
Limo
Banana
Pepino
Tomate
Agora vamos fazer um commit usando a opo -a, essa opo adiciona diretamente todos
os arquivos modificados e que j estejam sendo monitorados pelo Git:
git commit -a
Nossa mensagem pode ser algo como a da figura 20:

Figura 20
Houve uma grande controvrsia com relao ao pepino e tomate e decidimos que no
queremos mais a alterao do arquivo frutas.txt. Ns poderamos simplesmente editar o
arquivo frutas.txt e fazer um novo commit, mas, aqui vamos usar um outro comando o:
git revert [opo] <commit>
Esse comando desfaz o commit cuje o ndice e informado e todas as mudanas aplicadas
nele, criando um novo commit.
Aqui simplesmente queremos desfazer o ltimo commit e todos as mudanas aplicadas a
ele para isso precisamos do seu ndice:
git log oneline

Figura 21
da nossa figura podemos ver que o ndice que queremos o 267aec2, lembrando que o
seu ndice e diferente.
git revert 267aec2
Aps darmos esse comando ele abre o editor de textos da seguinte forma:

Figura 22
podemos colocar uma mensagem nesse commit, lembre revert desfaz as mudanas de
um commit anterior e cria um novo commit. Nossa menssagem poderia ser a seguinte:

Figura 23
Agora se ns abrirmos o arquivo frutas.txt vermos que ele voltou ao estagio anterior sem
os pepinos e tomates.
Ateno git revert s muda o que foi alterado no commit selecionado quaisquer outras
mudanas realizadas em outros commits permanecem.
Existem outros comandos para voc refazer commits que no foram apresentados aqui.

Trabalhando com Branchs ou Ramos


Falamos muito de branchs chegou a hora de v-los em ao. Na fifura 24 temos uma
representao grfica de um repositrio com dois branchs master e ecotico, onde os
crculos representam os commits. O branch master representado pelos commits A, B, C,
D e o branch exotico por A, B, C, 1, 2. Repare que o branch exotico e uma continuao do
branch master a partir do commit C.

Figura 24
Branchs permitem muitas coisas e um dos seus principais usos e que diferentes verses
do mesmo aplicativo sejam construdas de forma independente e sempre que houver
necessidade voc pode combinar as diferentes verso atravs da fuso (merge) dos
branchs.
Vamos criar um branch no nosso exemplo para que possamos cuidar dos nossos pepinos
e tomates sem que ningum no branch master ns incomode:
git checkout -b exotico
ao dar esse comando o Git cria o novo branch exotico e muda o nosso HEAD para ele.

Figura 25
Agora que estamos no nosso branch exotico vamos adicionar novamente os nossos
pepinos e tomates a frutas.txt:
Abacate
Goiaba
Laranja
Limo
Banana
Pepino
Tomate
Bom agora precisamos confirmar a nossa alterao com um git add e depois realizar o
nosso commit, ou simplesmente podemos dar o comandos:
git commit -a
Inserindo uma mensagem como:

Vamos agora colocar mais algumas frutas tropicais exticas nos arquivos frutas.txt:
Abacate
Goiaba
Laranja
Limo
Banana
Pepino
Tomate
Abric
Caj
Pequi
e tropicais.txt:
Abacate
Goiaba
Banana
Abric
Caj
Pequi
Agora antes de adicionarmos as mudanas atravs do nosso commit podemos dar um
comando git status para verificar se estamos mesmo no branch exotico:

Figura 26
e damos ento fazemos nosso commit:
git commit -a

Que tal dar uma olhada geral em nosso branch exotico com:
git log oneline

Figura 27

Lembre-se o o branch exotico comea no ltimo commit realizado no nosso branch


master, ento atualmente ele tem todos os commits de master mais os seus commits.
Vamos retornar ao branch master, para alterar entre branchs o comando usado :
git checkout <branch>
no caso:
git checkout master
verifique se mudamos mesmo de um:
git status

Figura 28

Verifique os seus commits:

Figura 29

git log --oneline


Vamos agora alterar no branch master: os arquivos frutas.txt:
Abacate
Goiaba
Laranja
Limo
Banana
Abacaxi
Mamo
Caj
e tropicais.txt:
Abacate
Goiaba
Banana
Abacaxi
Mamo
Caj
Vamos gravar as alteraes atravs de um commit:
git commit -a

Figura 30

Vamos ver uma imagem grfica de todos os nossos commits em todos os branchs atravs
do comando:
git log --all --graph --oneline

Figura 31

Com esse comando o Git (tenta) forma um grafo dos commits mostrando os dois branchs
existentes essa figura pode estar melhor representada na figura 32:

Figura 32

Realizando Merges ou Fuses


Depois de muita conversa o grupo resolveu que pode aceitar as frutas exticas, ento
voc precisa agora fazer uma fuso (ou merge) entre seu branch exotico e o brach master
para que as nossas frutas exticas passem a fazer parte a linha principal do nosso
desenvolvimento. A primeira coisa que precisamos saber em que branch ns deixamos
o nosso repositrio na ltima vez usamos ele:
git status

Figura 33

no caso acima estou no branch exotico ento para realizar o merge de exotico para
master preciso primeiro ir para o branch master (se no seu caso em particular voc j
estiver em master pule essa etapa):
git checkout master
Agora no branch master damos o comando:
git merge exotico
Ops agora ns temos um problema como mostra a figura 34:

Surgiu um conflito no nosso merge, para que possamos ter uma ideia do que ocorreu
vamos dar o comando:

git diff

Figura 34
Vamos comparar as linhas de cada arquivo frutas.txt
Master

Exotico

Abacate

Abacate

Goiaba

Goiaba

Laranja

Laranja

Limo

Limo

Banana

Banana

Abacaxi

Pepino

Mamo

Tomate

Caj

Abric

Caj

10

Pequi

E no arquivo tropicais.txt temos:


Master

Exotico

Abacate

Abacate

Goiaba

Goiaba

Banana

Banana

Abacaxi

Abric

Mamo

Caj

Caj

Pequi

Repare que existem mesmas linhas com valores distintos isso causou o problema do
nosso merge.
Infelizmente nem sempre o Git ter solues automticas para voc em muitos caso de
fuso a soluo vai ser editar arquivo por arquivo divergente fazer um novo commit e
terminar o merge:
Abra o seu arquivo frutas.txt ele deve se encontrar como abaixo:
Abacate
Goiaba
Laranja
Limo
Banana
<<<<<<< HEAD
Abacaxi
Mamo
Caj
=======
Pepino
Tomate
Abric
Caj
Pequi
>>>>>>> exotico
Vamos deixar ele como abaixo e salve-o:
Abacate
Goiaba
Laranja
Limo
Banana
Abacaxi

Mamo
Caj
Pepino
Tomate
Abric
Caj
Pequi
Agor vamos ajeitar o arquivo tropicais.txt do estado abaixo:
Abacate
Goiaba
Banana
<<<<<<< HEAD
Abacaxi
Mamo
Caj
=======
Abric
Caj
Pequi
>>>>>>> exotico
passe ele para:
Abacate
Goiaba
Banana
Abacaxi
Mamo
Caj
Abric
Caj
Pequi
Agora precisamos adicionar nossos novos arquivos ao repositrio com:
git add .
O . aqui funciona como no linux para definir o diretrio atual ou seja adicione tudo que
est nesse diretrio.
Agora vamos realizar o nosso commit de merge:
git commit
O editor de textos e aberto para sua mensagem:

Figura 35
Aps esse commit o merge continua sozinho e fim.

Clone, pull e push

Você também pode gostar