Este documento fornece uma introdução ao Git, incluindo: 1) O que é Git e como funciona; 2) Como inicializar e clonar repositórios; 3) Como ignorar arquivos, adicionar alterações e fazer commits. Ele também explica como usar branches, comparar commits, compartilhar alterações e reverter mudanças.
2. Agenda
1. O que é isso?
2. Layout dos repositórios
3. Uma introdução pragmática
1. Criar / clonar repositórios
2. Ignorar ficheiros
3. Adicionar ficheiros e submeter alterações
4. Branching / merging
5. Comparar commits e consultar a história
6. Partilhar alterações
7. Stashing
8. Remote branches
9. "Desfazer" alterações
3. O que é:
● desenvolvido por Linus Torvalds;
● um sistema de controlo de versões (VCS);
● distribuído vs centralizado;
(rep. privados && rep. públicos)
● commit ID's vs revision numbers;
● metodologia de desenvolvimento ramificada (branches);
4. Layout dos repositórios
Uma configuração típica,
com repositórios locais
privados e repositórios
públicos.
Os layouts podem ser
uma mistura entre as
configurações
centralizada e distribuída.
Fonte: Pragmatic Guide to Git -
2010 Swicegood, Travis
5. Criar/clonar Repositórios
● criar uma nova directoria .git na directoria actual
● inicializar o repositório Git
$> cd /path/to/project/
$> git init
● o repositório é inicializado uma única vez
● pode ser apagado da mesma forma que qualquer outra directoria
6. Criar/clonar Repositórios
$> cd /path/to/project/
$> git clone some-repository
● URI's válidos p/ o comando git clone:
user@ssh_host:path_to_repo
git://some_domain/path_to_repo
http://some_domain/path_to_repo
https://some_domain/path_to_repo
$> git clone --depth <x> some-repository
● shallow copies
● copia apenas os últimos x commits do repositório
● não pode ser clonado
7. Ignorar ficheiros
● criar ficheiro .gitignore na raíz da directoria do projecto
● e.g.:
# this is a comment
# ignore foo.txt file
foo.txt
# ignore generated pyc files
*.pyc
# but do not ignore bar.pyc
!bar.pyc
# ignore all directories
*.[a]
● ignorar ficheiros relativamente a um repositório: .
git/info/exclude
8. Adicionar Ficheiros e Submeter
Alterações
● adicionar ficheiros ao index do repositório
$> git add <some-file>
● os ficheiros ficam staged e prontos para integrarem um
commit
● consultar o estado do index
$> git status
● apresenta também info. sobre a relação entre o repositório
e os restantes ficheiros
● submeter as alterações
$> git commit -m "<message>"
9. Branching / Merging
● um repositório pode conter múltiplos branches de
desenvolvimento
$> git branch <branchname>
● o nome do branch pode ser definido como uma path
$> git branch author/dev-type/what_to_do
● listar branches locais
$> git branch
$> *master
$> author/dev-type/what_to_do
● listar todos os branches (locais e remotos)
$> git branch -a
$> *master
$> author/dev-type/what_to_do
$> remotes/origin/master
10. Branching / Merging
● mudar de branch
$> git checkout <branchname>
● as alterações só são visíveis no branch actual
● para aplicá-las noutro branch é necessário fazer merge
$> git checkout <other-branchname>
$> git merge <branchname>
● se tudo correr bem, as alterações serão incorporadas
no branch actual
● caso contrário, surgirão conflitos que necessitarão de ser
resolvidos
11. Comparar commits e consultar a
história
● comparar commits permite ver o que realmente foi alterado
● podem comparar-se quaisquer dois pontos da história do
projecto
● consultar alterações feitas mas que ainda não foram staged
$> git diff
● consultar alterações que foram staged (mas não commited)
$> git diff --cached
● comparar alterações com o último commit (HEAD)
$> git diff HEAD
12. Comparar commits e consultar a
história
● comparar as alterações actuais com o estado (último
commit) de outro branch
$> git diff <branchname>
● comparar HEAD com as alterações actuais, limitando
apenas a 1 ficheiro
$> git diff HEAD -- ./animals/models.py
● comparar alterações com o último commit (HEAD)
$> git diff HEAD
● obter um sumário de todas as alterações actuais
$> git diff --stat
13. Comparar commits e consultar a
história
● finalmente, a comparação pode ser feita entre quaisquer
dois commits...
$> git diff <commit X>..<commit Y>
● ...ou entre quaisquer dois commits e o seu atepassado
comum
$> git diff <commit X>...<commit Y>
14. Comparar commits e consultar a
história
● consultar a história do repositório
$> git log
● o comando permite várias opções de consulta
● e. g: commits desde um branch específico
$> git log v1.0..
● commits desde uma data específica
$> git log --since="2 weeks ago"
● mostrar que ficheiros foram alterados, nº de linhas
removidas / adicionadas, em cada commit
$> git log --stat
15. Partilhar alterações
● actualizar repositório privado
$> git fetch <remote name>
● não é feito merge das alterações
● permite comparar as alterações antes de efectuar
um merge
$> git diff <local branch> <remote branch>
● em alternativa
$> git pull <remote name>
● combina fetch e merge num só comando
● é útil (tipo mágico!), mas pode dar algumas dores de
cabeça...
16. Partilhar alterações
● enviar alterações para branch remoto
$> git push [<local name>] [<remote name>]
● pode-se evitar introduzir os nomes do branch local e
remoto, configurando o ficheiro .git/config
● e.g.:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = ssh_key:remote_repo.git
[branch "master"]
remote = origin
merge = refs/heads/master
17. Partilhar alterações
● commit e share são duas tarefas distintas;
● para manter os branches locais sincronizados com
os branches remotos, é necessário efectuar um git fetch;
● depois de sincronizados, é preciso fazer
um merge dos branches para que as alterações fiquem
disponíveis localmente;
● alternativa: git pull;
18. Stashing
● permite "guardar" temporariamente as alterações em curso
e voltar ao estado inicial do branch
$> git stash "coding a fix"
● o index deixa de ter quaisquer alterações
● permite uma lista de stashed items
$> git stash list
● as alterações podem ser recolocadas novamente no branch
$> git stash apply [<stash queue item>]
● é extremamente útil em situações ad-hoc
19. Remote Branches
● criar um branch local
$> git branch -b <branch name>
● fazer checkout para o novo branch e realizar eventuais
alterações
● o novo branch é submetido com push
$> git push <remote name> <branch name>
● um branch remoto pode também ser apagado
$> git push <remote name> :<branch name>
● apaga o branch no repositório remoto; é necessário apagá--
lo no repositório local
$> git branch -d <branch name>
20. Reverter alterações
1. considerar se as alterações não foram commited
2. considerar se as alterações já foram commited
● no primeiro caso, se o index estiver mesmo messed up
$> git reset --hard HEAD
● as alterações serão todas revertidas
● mas pode-se reverter as alterações de um único ficheiro
$> git reset HEAD <file name>
● o ficheiro voltará ao estado anterior
21. Reverter alterações
● no segundo caso, se as alterações já foram commited e
eventualmente publicadas
$> git revert HEAD
● as alterações serão revertidas para um commit anterior e
será criado um novo commit
● a mensagem de commit poderá ser alterada