git e seu amigo

39
Git é seu amigo Celestino Gomes 1 Saturday, September 12, 2009

Upload: celestino-gomes

Post on 06-Dec-2014

3.442 views

Category:

Technology


1 download

DESCRIPTION

Essa foi a apresentação usada no RailsForKids 2009, onde falei um pouco sobre Git

TRANSCRIPT

Git é seu amigo

Celestino Gomes

1Saturday, September 12, 2009

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

2Saturday, September 12, 2009

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

3Saturday, September 12, 2009

Como funciona?

4Saturday, September 12, 2009

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)

5Saturday, September 12, 2009

Object Database

• Quatro tipos de objetos:

• Blob, Tree, Commit e Tag

• Todos registrados/gravados da mesma maneira

6Saturday, September 12, 2009

Object Database - Loose format

conteudo

“2e6f9b0d5885b6010f9167787445617f553a735f”

header + conteudo

zlib(header + conteudo)

.git/objects/2e/6f9b0d5885b6010f9167787445617f553a735f

7Saturday, September 12, 2009

Object Database - Packed format

.git/objects/2e/6f9b0d5885b6010f9167787445617f553a735f

.git/objects/0b/772ec8eb9ae8952c3c1e56a9ffbe49385cc83a

.git/objects/72/16b02627bc3d6ef57008f7ff67f0f8f13f488e

.git/objects/pack/pack-0bc9a42eb66d7ae36bf44af8ff5a3888e8a02d12.idx

.git/objects/pack/pack-0bc9a42eb66d7ae36bf44af8ff5a3888e8a02d12.pack

git-gc

8Saturday, September 12, 2009Digamos 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’.

Object Database - Blob

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

9Saturday, September 12, 2009

Object Database - Tree

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

tree: 1fba94

tree: 3ef95a

tree: 34ba74

/lib

/spec

/

10Saturday, September 12, 2009

commit: 8d1ab4

Object Database - Commit

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

tree: 1fba94

tree: 3ef95a

tree: 34ba74

/lib

/spec

/

11Saturday, September 12, 2009

commit: 8d1ab4

Object Database - Commit

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

tree: 1fba94

tree: 3ef95a

tree: 34ba74

/lib

/spec

/

commit: 61db26

blob: 41d300

blob: 7034fe

blob: 2a03fb

tree: 1fba94

tree: 3ef95a

tree: 34ba74

12Saturday, September 12, 2009

Object Database - Tag

commit: 8d1ab4

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

tree: 1fba94

tree: 3ef95a

tree: 34ba74

/lib

/spec

/

tag: 6ee1f2

13Saturday, September 12, 2009

Object Database - Resumindo

14Saturday, September 12, 2009

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

15Saturday, September 12, 2009

References

commit: 8d1ab4

blob: 2e6f9b

blob: 7034fe

blob: a738fc

active_content.rb

active_content_spec.rb

Rakefile

tree: 1fba94

tree: 3ef95a

tree: 34ba74

/lib

/spec

/

master HEAD.git/refs/heads/master

16Saturday, September 12, 2009Um 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.

Staging Index

Commited

Staged

Untrackedlib.rb

lib.rb

lib.rb

$ git add lib.rb

$ git commit -m “lib.rb”

17Saturday, September 12, 2009

Flow básico

18Saturday, September 12, 2009

Criação de repositórios

$ rails my_blog...$ cd my_blog$ git init$ git add .$ git commit -m “Initial commit”

$ git clone git://github.com/tinogomes/my_blog_app_with_bug.git$ cd my_blog_app_with_bug$ git branchmaster

Criando um novo repositório

Criando um repositório a partir de um outro

19Saturday, September 12, 2009

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

20Saturday, September 12, 2009

Indo além do flow básico

21Saturday, September 12, 2009

Adicionando arquivos

$ git add . (cuidado)

$ git add <dir>

$ git add *.rb

$ git add <dir>/<arquivo>

22Saturday, September 12, 2009

Trabalhando com branch local

$ cd my_blog_app_with_bug$ git branch meu_branch_local...$ git checkout master$ git pull . master$ git push origim master

$ git branch -d meu_branch_local

23Saturday, September 12, 2009

Navegando pelo histórico

$ git log --stat

commit 7f5a85113381e8c0d16e4679c4e5a81a4eb000b8Author: Celestino Gomes <[email protected]>Date: Sat Sep 12 02:22:52 2009 -0300

Initial commit

README | 243 ++ Rakefile | 10 + app/controllers/application_controller.rb | 10 + app/helpers/application_helper.rb | 3 + config/boot.rb | 110 +... test/performance/browsing_test.rb | 9 + test/test_helper.rb | 38 + 41 files changed, 8452 insertions(+), 0 deletions(-)

24Saturday, September 12, 2009

Navegando pelo histórico$ git log -p --no-merges

commit 7f5a85113381e8c0d16e4679c4e5a81a4eb000b8Author: Celestino Gomes <[email protected]>Date: Sat Sep 12 02:22:52 2009 -0300

Initial commit

diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rbnew file mode 100644index 0000000..4b60558--- /dev/null+++ b/test/performance/browsing_test.rb@@ -0,0 +1,9 @@+require 'test_helper'+require 'performance_test_help'++# Profiling results for each test method are written to tmp/performance.+class BrowsingTest < ActionController::PerformanceTest+ def test_homepage+ get '/'+ end+end

25Saturday, September 12, 2009

Navegando pelo histórico

$ git log --pretty=oneline

7f5a85113381e8c0d16e4679c4e5a81a4eb000b8 Initial commit

$ git blame app/helpers/application_helper.rb

^7f5a851 (Celestino Gomes 2009-09-12 02:22:52 -0300 1) module ApplicationHelper^7f5a851 (Celestino Gomes 2009-09-12 02:22:52 -0300 2) end

26Saturday, September 12, 2009

Manipulando o índice

$ git reset --soft [<commit>]

$ git reset [<commit>]

$ git reset --hard [<commit>]

$ git commit --amend

Remove do stage index

Limpa os arquivos, inclusive os unstagged

Coloca os arquivos de volta para o stage index

Permite alterar o último commit

27Saturday, September 12, 2009

<commit> - default HEAD

A diferença entre merge e rebase

C1

C2

C3

C4

C5

master sprint_branch

28Saturday, September 12, 2009

A diferença entre merge e rebase

C1

C2

C3

C6

C4

C5

merge commit

master sprint_branch

$ git checkout master$ git pull . sprint_branch

$ git checkout master$ git fetch$ git merge sprint_branch

ou

29Saturday, September 12, 2009

A diferença entre merge e rebase

C1

C2

C3

C4’ C5’

master

$ git checkout master$ git pull --rebase . sprint_branch

$ git checkout master$ git fetch$ git rebase sprint_branch

ouC4

C5

30Saturday, September 12, 2009

Usando o stash

$ git stash show stash@{0}

$ git stash

$ git stash list

$ git stash apply

$ git stash drop stash@{0}

31Saturday, September 12, 2009

Revertendo commits

$ git revert <commit_hash>

$ git revert -n <commit_hash>

32Saturday, September 12, 2009

-n para deixar a reversão no index

Buscando por bugs

$ git bisect start [<bad> [<good>]]

$ git bisect good | bad [<rev>]

$ git bisect reset

$ git bisect run <cmd | script>

$ git bisect skip [(<rev>|<range>)]

33Saturday, September 12, 20091) Primeiro é necessário identificar pontos (commits) bons e ruins para começar a caça. Usar $ git log2) $ 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.

Limpando a sujeira do dia-a-dia

$ git clean -d -f

$ git push origin :<branch_remoto>

$ git stash clear

Remover arquivos/diretórios não trackeados

Remover um branch remoto

Limpar todo o stash

34Saturday, September 12, 2009clean para remover arquivos/diretórios não trackeados, push origin :<branch> limpa branches remotos, stash para limpar todo o stash

Funciona no Windows?

• Somente através do cygwin ou msysGit

35Saturday, September 12, 2009

Perguntas

?37Saturday, September 12, 2009

Mais sobre mim

• http://blog.tinogomes.com

38Saturday, September 12, 2009

Obrigado!

;)39Saturday, September 12, 2009