1. Git é seu amigo
Celestino Gomes
Saturday, September 12, 2009 1
2. O quê?
• Criado em 2005 por Linus Torvalds
• Necessidade, linux-kernel-devs
• Originalmente, era um engine para VCS
• Fluxo de trabalho distribuído
• Prevenção de corrupção acidental
• Alta performance
Saturday, September 12, 2009 2
3. Características básicas
• Controle de versão distribuido (DVCS)
• Gerenciamento de conteúdo e não arquivos
• Branches como unidade de trabalho
• SHA1 para associação e verificação
• Staging index
• Não é o subversion
Saturday, September 12, 2009 3
5. Diretório .git
• Diretório .git na raíz de cada projeto
• Arquivos de configuração (.git/config)
• Index (.git/index)
• Hooks (.git/hooks)
• Object Database (.git/objects)
• References (.git/refs)
Saturday, September 12, 2009 5
6. Object Database
• Quatro tipos de objetos:
• Blob, Tree, Commit e Tag
• Todos registrados/gravados da mesma maneira
Saturday, September 12, 2009 6
7. Object Database - Loose format
conteudo
header + conteudo
“2e6f9b0d5885b6010f9167787445617f553a735f”
zlib(header + conteudo)
.git/objects/2e/6f9b0d5885b6010f9167787445617f553a735f
Saturday, September 12, 2009 7
8. Object Database - Packed format
.git/objects/2e/6f9b0d5885b6010f9167787445617f553a735f
.git/objects/0b/772ec8eb9ae8952c3c1e56a9ffbe49385cc83a
.git/objects/72/16b02627bc3d6ef57008f7ff67f0f8f13f488e
git-gc
.git/objects/pack/pack-0bc9a42eb66d7ae36bf44af8ff5a3888e8a02d12.idx
.git/objects/pack/pack-0bc9a42eb66d7ae36bf44af8ff5a3888e8a02d12.pack
Saturday, September 12, 2009 8
Digamos que os objetos listados referenciem o mesmo arquivo, com conjuntos pequenos de diferenças geradas ao longo do tempo. Usar uma
ferramenta de manutenção (git-gc, por exemplo) vai compactar os objetos e armazená-los em ‘/pack’.
15. Object Database - Resumo
• Blob é o menor objeto do git
• Tree contém Trees e Blobs
• Commit contém Commits, Trees e Blobs
• Tags contém/apontam um Commit
Saturday, September 12, 2009 15
16. References
.git/refs/heads/master master HEAD
commit: 8d1ab4
/ tree: 1fba94
Rakefile blob: 2e6f9b
/lib tree: 3ef95a
active_content.rb blob: 7034fe
/spec tree: 34ba74
active_content_spec.rb blob: a738fc
Saturday, September 12, 2009 16
Um branch é um ponteiro para um commit. Quando se avança um branch adicionando commits, o que está acontecendo, por baixo dos panos, é
mudar o ponteiro do branch para um novo commit.
19. Criação de repositórios
Criando um novo repositório
$ rails my_blog
...
$ cd my_blog
$ git init
$ git add .
$ git commit -m “Initial commit”
Criando um repositório a partir de um outro
$ git clone git://github.com/tinogomes/my_blog_app_with_bug.git
$ cd my_blog_app_with_bug
$ git branch
master
Saturday, September 12, 2009 19
20. Trabalhando em um branch remoto
$ cd my_blog_app_with_bug
$ git checkout -b refactoring origin/refactoring
... após modificações
$ echo tmp > .gitignore
$ git add .
$ git commit -m “outras modificacoes”
$ git pull
$ git push origin refactoring
Saturday, September 12, 2009 20
21. Indo além do flow básico
Saturday, September 12, 2009 21
27. Manipulando o índice
Remove do stage index
$ git reset [<commit>]
Limpa os arquivos, inclusive os unstagged
$ git reset --hard [<commit>]
Coloca os arquivos de volta para o stage index
$ git reset --soft [<commit>]
Permite alterar o último commit
$ git commit --amend
Saturday, September 12, 2009 27
<commit> - default HEAD
28. A diferença entre merge e rebase
master sprint_branch
C1
C2 C4
C3 C5
Saturday, September 12, 2009 28
29. A diferença entre merge e rebase
master sprint_branch
C1
$ git checkout master
$ git pull . sprint_branch
C2 C4
ou
$ git checkout master
C3 C5 $ git fetch
$ git merge sprint_branch
C6 merge commit
Saturday, September 12, 2009 29
30. A diferença entre merge e rebase
master
C1
$ git checkout master
$ git pull --rebase . sprint_branch
C2 C4
ou
$ git checkout master
C3 C5 $ git fetch
$ git rebase sprint_branch
C4’ C5’
Saturday, September 12, 2009 30
31. Usando o stash
$ git stash
$ git stash list
$ git stash show stash@{0}
$ git stash apply
$ git stash drop stash@{0}
Saturday, September 12, 2009 31
32. Revertendo commits
$ git revert <commit_hash>
$ git revert -n <commit_hash>
Saturday, September 12, 2009 32
-n para deixar a reversão no index
33. Buscando por bugs
$ git bisect start [<bad> [<good>]]
$ git bisect good | bad [<rev>]
$ git bisect skip [(<rev>|<range>)]
$ git bisect reset
$ git bisect run <cmd | script>
Saturday, September 12, 2009 33
1) Primeiro é necessário identificar pontos (commits) bons e ruins para começar a caça. Usar $ git log
2) $ git bisect run my_script - Note that the "run" script (my_script in the above example) should exit with code 0 in case the current source code is
good. Exit with a code between 1 and 127 (inclusive), except 125, if the current source code is bad.
34. Limpando a sujeira do dia-a-dia
Remover arquivos/diretórios não trackeados
$ git clean -d -f
Remover um branch remoto
$ git push origin :<branch_remoto>
Limpar todo o stash
$ git stash clear
Saturday, September 12, 2009 34
clean para remover arquivos/diretórios não trackeados, push origin :<branch> limpa branches remotos, stash para limpar todo o stash
35. Funciona no Windows?
• Somente através do cygwin ou msysGit
Saturday, September 12, 2009 35