O documento apresenta uma sessão livre sobre o sistema de controle de versões Git. Aborda tópicos como a história do Git, inicialização de repositórios, branches, commits, merges, tags e comandos úteis.
1. GIT Source Control
GLUA - Sessão Livre
Ilan Pegoraro
Igor Duarte Cardoso
12/03/2014
2. História
● Criado por Linus Torvalds em 2005;
● Controlo de versões distribuído;
● Multi-plataforma (Unix-like, Windows, etc.);
● Interface de linha de comandos, no entanto
existem várias alternativas gráficas:
○ gitk;
○ tig (linha de comandos mas usa n-curses);
○ Integração com IDEs;
○ Source-tree (OS X e Windows).
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
3. Inicialização do repositório
Criação de um repositório local no diretório atual (pasta .git):
● $ git init
Sessão livre sobre GIT
● $ git clone <url>
Grupo Linux da Universidade de Aveiro
4. .gitignore
É um ficheiro utilizado para especificar outros ficheiros que o git deve ignorar.
Sintaxe:
● Cada linha especifica uma regra;
● Shell globbing;
● # para comentários;
● O caráter ! no início da linha inverte o sentido da regra;
● Recursivo (regras são aplicadas a partir do diretório actual).
Nota: Só funciona para os ficheiros que o git não esteja a seguir, caso contrário
é preciso removê-los com git rm <ficheiro>.
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
5. .gitignore
<linha em branco>
# comentário... não é reconhecido como regra
*.class
*.jar
!lib/MyPrecious.jar
*~
src/Test.java
build/
Sessão livre sobre GIT
Exemplo:
Grupo Linux da Universidade de Aveiro
6. git config
Permite configurar opções do repositório ou opções globais, como:
● Editor;
● Dados do autor;
● Interface com cores.
$ git config core.editor vim
$ git config color.ui true
$ git config user.name Glua
$ git config user.email “glua@ua.pt”
Nota: Para remover basta usar a flag --unset
$ git config --unset …
Nota 2: Para configurações globais basta usar a flag --global.
$ git config --global …
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
7. Adicionar um ficheiro
git add permite adicionar um ficheiro à staging area.
$ git add Main.java
Nota: Após esta ação, o git irá criar um objeto na
armazém de objetos que corresponde aos ficheiros
criados e/ou alterados. Tecnicamente, as alterações
são guardadas em disco.
$ git status $ tree .git/objects
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
8. Staging Area
● É a área que permite organizar um commit antes de o escrever no histórico
do projeto;
● Serve para o git não estar continuamente a manipular o repositório.
# On branch master
# Changes to be committed:
#
# new file: MyClass.java
#
# Changes not staged for commit:
#
# modified: Main.java
#
# Untracked files:
#
# Main.class
Nota: para remover um ficheiro da staging area, git rm --cached <ficheiro>
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
9. Mensagem de commit (opcional)
...mas recomendado!
Titulo
<linha em branco>
Corpo da messagem...
As mensagens de commit do git têm um formato de conveniência, contudo não
é obrigatório segui-lo.
Nota: consultem as boas práticas para mensagens de commit:
http://sethrobertson.github.io/GitBestPractices/
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
10. Guardar alterações (commit)
git commit cria um novo objeto (commit object) com conteúdo da staging
area e atualiza as referências HEAD e master.
● ID - função hash (sha1) de:
○ Conteúdo;
○ Autor;
○ Data;
○ Mensagem de log;
○ ID do commit antigo.
$ git commit
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
11. Guardar alterações (commit)
$ git add Main.java
$ git commit
HEAD master
$ git add MyClass.java ... $ git commit
Sessão livre sobre GIT
A
HEAD
B
master
A
HEAD master
A
Grupo Linux da Universidade de Aveiro
12. Manipulação de ficheiros
● git rm <fich>
○ Remove o ficheiro do repositório;
● git rm --cached <fich>
○ Remove o ficheiro do repositório quando já foi adicionado;
● git mv <antigo> <novo>
○ Altera o nome do ficheiro <antigo> por <novo>;
○ git é tão inteligente que detecta a alteração do nome do ficheiro,
mesmo sem usar o comando git mv.
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
13. Consulta de commit
git log permite visualizar a listagem de todos os commits existentes no
repositório.
$ git log
$ git log --graph --decorate
$ git log --stat
$ git log <fim>..<inicio>
$ git shortlog
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
14. Ramos
git branch cria uma nova linha de desenvolvimento.
● São armazenados em .git/refs/heads
Isolamento Trabalho Atualização Integração
$ git branch feature
HEAD master
A
Sessão livre sobre GIT
feature
B
Grupo Linux da Universidade de Aveiro
15. Ramos
Sessão livre sobre GIT
● Permanent Branches
○ Ramo de integração, por exemplo master;
○ Ramo de desenvolvimento, por exemplo develop;
○ Persistem no repositório.
● Topic Branches
○ Surgem dois tipos: hotfixes, feature (por convenção);
○ São utilizados para corrigir falhas ou desenvolver pequenas
funcionalidades.
Dicas
Nota: git flow simplifica a utilização deste modelo de branching.
http://nvie.com/posts/a-successful-git-branching-model/
Grupo Linux da Universidade de Aveiro
16. Ramos
git checkout atualiza os ficheiros do diretório de trabalho com a versão
existente na base de dados referente ao ramo pretendido.
Nota: git checkout -b <branch> cria o ramo e faz checkout para o
mesmo.
$ git checkout feature
HEAD
A
Sessão livre sobre GIT
feature master
B
Grupo Linux da Universidade de Aveiro
17. Ramos
git checkout atualiza os ficheiros do diretório de trabalho com a versão
existente na base de dados referente ao ramo pretendido.
Nota: git checkout -b <branch> cria o ramo e faz checkout para o
mesmo.
$ git checkout feature
HEAD master
A
Sessão livre sobre GIT
feature
B
Grupo Linux da Universidade de Aveiro
18. Ramos
git checkout pode ainda ser usado para atualizar os ficheiros do diretório
de trabalho para um determinado commit do histórico, temporariamente.
$ git checkout c02293177dd5db9d458f20a6fd27bf8849d0c01f
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
19. Ramos
git branch também permite visualizar os ramos existentes no repositório
# mostra os ramos locais
$ git branch
# mostra os ramos remotos
$ git branch -r
# mostra todos os ramos
$ git branch -a
# remove o ramo
$ git branch -d feature
# força a remoção do ramo cuidado!
$ git branch -D feature
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
20. Ramos
Sessão livre sobre GIT
A
master HEAD
B
feature
C D
após commits em feature
Grupo Linux da Universidade de Aveiro
21. Ramos
B
Sessão livre sobre GIT
após commits em master
A
HEAD master
feature
C D
E
$ git checkout master
Grupo Linux da Universidade de Aveiro
22. Merging
Merging é o processo de integrar commits de um ramo noutro.
● fast-forward merge;
● 3-way merge;
● Octopus.
Todas as estratégias utilizam o comando git merge.
● A estratégia utilizada é detectada automaticamente pelo git.
$ git checkout master
$ git merge feature
Nota: O merge é feito no ramo master, deixando o outro inalterado.
Sessão livre sobre GIT
Grupo Linux da Universidade de Aveiro
23. Merging
Fast-forward merge
$ git checkout master
Sessão livre sobre GIT
A
HEAD
master
B
feature
C D
Grupo Linux da Universidade de Aveiro
24. Merging
Fast-forward merge
$ git merge feature
Sessão livre sobre GIT
A
HEAD
master
B
feature
C D
Grupo Linux da Universidade de Aveiro
25. Merging
3-way merge
$ git checkout master
Sessão livre sobre GIT
A
master
B
feature
C D
E
HEAD
Grupo Linux da Universidade de Aveiro
26. Merging
3-way merge
$ git merge
Sessão livre sobre GIT
A
master
B
feature
C D
E
HEAD
F
Grupo Linux da Universidade de Aveiro
27. Conflitos
Ao fazer o merge podem surgir conflictos entre alterações ao mesmo ficheiro.
● $ git checkout --ours Main.java
○ Checkout do nosso ficheiro, ignorando as alterações feitas por outros;
● $ git checkout --theirs Main.java
○ Checkout do ficheiro alterado por outros, ignorando as nossas
alterações;
● $ git mergetool;
● Resolver conflitos manualmente.
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
28. Reset
Permite navegar pelo histórico, voltando para um commit em que o estado do
projeto esteja correto.
# Limpa a staging area
$ git reset
$ git reset HEAD
# Para além de limpar faz checkout do ponto desejado (cuidado!)
$ git reset --hard master~
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
29. Remote
● Inicialização com git clone já configura o remote.
● São armazenados em .git/refs/remotes
● Pelo contráraio a inicialização com git init não o faz.
$ git remote add <nome> <url>
● Listagem
○ git remote
○ git remote -v
● Remoção
○ git remote remove <nome>
● Operações que utilizam remote
○ $ git fetch
○ $ git pull
○ $ git push
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
30. Desenvolvimento em grupo
git fetch descarrega as referências juntamente com os objetos necessários para
completar o histórico.
$ git fetch remote refs
exemplo:
$ git fetch origin develop
Este comando irá descarregar o branch develop e criar um novo branch com o
nome origin/develop.
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
31. Desenvolvimento em grupo
git pull é a combinação do comando fetch com o merge.
git pull origin develop, traduz-se para:
$ git fetch origin develop
$ git merge origin/develop
Nota: As operações sobre branches são sempre feitas relativamente ao branch
atual.
Sessão livre sobre GIT
- criação implicita do origin/develop
- merge tipicamente fast-forward, mas
não necessariamente
Grupo Linux da Universidade de Aveiro
32. Desenvolvimento em grupo
git push operação oposta ao fetch, isto é, envia as referências juntamente com
os objetos necessários.
$ git push origin master
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
33. Alias
É possível configurar alias para evitar escrever comandos longos.
$ git config alias.st status
$ git config alias.ci commit
$ git config alias.l “log --decorate --graph”
$ git config alias.ll “log --pretty=oneline --abbrev-commit”
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
34. Tags
git tag cria uma referência, ou seja, dá um nome a um objeto de commit.
● São armazenadas em .git/refs/tags;
● Gestão de tags é feita através do comando
○ $ git tag
● Enviadas para o remote
○ $ git push origin --tags
● Utilizando a opção -a dizemos ao git para criar uma tag anotada, ou seja,
permite armazenar uma mensagem junto com a tag;
● Para além da mensagem ainda é possível assinar as tags
criptográficamente.
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT
35. Tags
A B
Sessão livre sobre GIT
feature
C D
E
HEAD
F
master
v0.3
beta-1
Grupo Linux da Universidade de Aveiro
36. Comandos úteis
Sessão livre sobre GIT
● git revert
○ Dado um ou mais commits, cria um novo objeto commit, para cada,
com o patch inverso da alteração;
● git cherry-pick
○ Dado um ou mais commits, aplica as alterações criando um novo
objeto commit para cada uma;
● git rebase
○ Permite modificar o histórico (não se deve fazer se já foi partilhado!);
● git ls-files
○ Mostra os ficheiros do repositório;
● git stash
○ Armazenar as alterações sem modificar o historico (área de stash);
Grupo Linux da Universidade de Aveiro
37. Comandos úteis
Sessão livre sobre GIT
● git rev-parse
○ Resolve o ID entre referências e ID abreviados;
● git bisect
○ Encontrar o commit que introduz um bug;
● git fsck
○ Verificação de erros no repositório;
● git gc --prune
○ Limpar objetos do git que não são necessários.
Grupo Linux da Universidade de Aveiro
38. Referências
● man pages são nossas amigas:
○ git help <comando> , por exemplo git help add
● Site oficial:
○ http://git-scm.org - contém documentação muito boa!
● Um modelo de branching:
○ http://nvie.com/posts/a-successful-git-branching-model/
● Teste online:
○ http://try.github.io/
● Outros:
○ Boas práticas de mensagens de commit no git: http://sethrobertson.
github.io/GitBestPractices/
○ Um projeto interessante (baseado em git) para guardar, sincronizar e
versionar ficheiros de configuração linux entre máquinas: https:
//github.com/RichiH/vcsh
Grupo Linux da Universidade de Aveiro Sessão livre sobre GIT