Marcel Gonçalves dos Santos
@marcelgsantos
git
criando commits
com
incríveis
Slide 2
Slide 2 text
pensandonaweb.com.br
tech lead e programador
Marcel Gonçalves dos Santos
@marcelgsantos
Slide 3
Slide 3 text
@phpsp
phpsp.org.br
Slide 4
Slide 4 text
Interaja nas mídias sociais!
- fale sobre o evento, palestrantes e conteúdo
- tire fotos do evento e publique
- interaja com outros participantes do evento
- tire dúvidas ou dê feedbacks para os palestrantes
Slide 5
Slide 5 text
Uma introdução
diferente sobre o Git
Slide 6
Slide 6 text
o Git é um sistema de controle de versão
decentralizado criado pelo Linus Torvalds
Slide 7
Slide 7 text
porém, existe uma outra de
fi
nição bastante
interessante que traz uma visão diferente
Slide 8
Slide 8 text
"Git is fundamentally a c
on
tent-addressable
filesystem with a VCS us
er
int
er
face wri
tt
en
on
t
op
of it." - Pro Git B
oo
k
Slide 9
Slide 9 text
“o Git é, fundamentalmente, um sistema de
ar
quivos end
er
eçável p
or
c
on
teúdo c
om
uma
int
er
face de usuário de c
on
trol
e de v
er
são
c
on
s
tr
uída sobre ele." - Livro Pro Git
Slide 10
Slide 10 text
um sistema de arquivo endereçável por
conteúdo é, de forma simples, um armazém
de dados do tipo chave-valor
Slide 11
Slide 11 text
pode-se adicionar qualquer tipo de conteúdo
em um repositório Git e ele devolverá uma
chave única para poder recuperá-lo
Slide 12
Slide 12 text
um repositório Git possui um diretório
especial onde localiza-se tudo o que é
armazenado e manipulado pelo Git
Slide 13
Slide 13 text
-
rw
-
r
- -
r
- -
1 marcel staff 64B Nov 13 17
:
28 COMMIT_EDITMSG
-
rw
-
r
- -
r
- -
@ 1 marcel staff 31K Nov 14 19
:
41 FETCH_HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 53B Nov 13 17
:
25 HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 41B Nov 13 17
:
23 ORIG_HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 440B Nov 8 01
:
37 conf
i
g
-
rw
-
r
- -
r
- -
1 marcel staff 73B Jul 30 2021 description
drwxr
-
xr
-
x 15 marcel staff 480B Nov 3 21
:
09 hooks
-
rw
-
r
- -
r
- -
1 marcel staff 306K Nov 13 17
:
28 index
drwxr
-
xr
-
x 4 marcel staff 128B Sep 23 18
:
20 info
drwxr
-
xr
-
x 4 marcel staff 128B Sep 23 18
:
20 logs
drwxr
-
xr
-
x 260 marcel staff 8.1K Nov 14 19
:
41 objects
-
rw
-
r
- -
r
- -
1 marcel staff 58K Nov 13 17
:
37 packed
-
refs
drwxr
-
xr
-
x 5 marcel staff 160B Sep 23 18
:
20 refs
Slide 14
Slide 14 text
o Git é composto por objetos e referências
na sua estrutura interna
Slide 15
Slide 15 text
esses elementos essenciais do Git estão
localizados nos diretórios objects e refs
Slide 16
Slide 16 text
-
rw
-
r
- -
r
- -
1 marcel staff 64B Nov 13 17
:
28 COMMIT_EDITMSG
-
rw
-
r
- -
r
- -
@ 1 marcel staff 31K Nov 14 19
:
41 FETCH_HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 53B Nov 13 17
:
25 HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 41B Nov 13 17
:
23 ORIG_HEAD
-
rw
-
r
- -
r
- -
1 marcel staff 440B Nov 8 01
:
37 conf
i
g
-
rw
-
r
- -
r
- -
1 marcel staff 73B Jul 30 2021 description
drwxr
-
xr
-
x 15 marcel staff 480B Nov 3 21
:
09 hooks
-
rw
-
r
- -
r
- -
1 marcel staff 306K Nov 13 17
:
28 index
drwxr
-
xr
-
x 4 marcel staff 128B Sep 23 18
:
20 info
drwxr
-
xr
-
x 4 marcel staff 128B Sep 23 18
:
20 logs
drwxr
-
xr
-
x 260 marcel staff 8.1K Nov 14 19
:
41 objects
-
rw
-
r
- -
r
- -
1 marcel staff 58K Nov 13 17
:
37 packed
-
refs
drwxr
-
xr
-
x 5 marcel staff 160B Sep 23 18
:
20 refs
Slide 17
Slide 17 text
os tipos de objetos disponíveis no Git são
blob, tree e commit
Slide 18
Slide 18 text
o diretório objects armazena todo conteúdo
de sua base de dados, isto é, os objetos
Slide 19
Slide 19 text
$ f
i
nd .git/objects
.git/objects
.git/objects/a3
.git/objects/a3/968e52c871c470f1892e2feb240fb32f9cfb80
.git/objects/pack
.git/objects/info
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/f9
.git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc
Slide 20
Slide 20 text
$ f
i
nd .git/objects
.git/objects
.git/objects/a3
.git/objects/a3/968e52c871c470f1892e2feb240fb32f9cfb80
.git/objects/pack
.git/objects/info
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/f9
.git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc
Slide 21
Slide 21 text
o diretório refs armazena ponteiros para
objetos de commit
Slide 22
Slide 22 text
os tipos de referências disponíveis no Git
são branches, tags, remotes e outros
Slide 23
Slide 23 text
$ f
i
nd .git/refs
.git/refs
.git/refs/heads
.git/refs/heads/main
.git/refs/tags
Slide 24
Slide 24 text
$ f
i
nd .git/refs
.git/refs
.git/refs/heads
.git/refs/heads/main
.git/refs/tags
Slide 25
Slide 25 text
O que é um commit?
Slide 26
Slide 26 text
para entender o que é um commit, precisamos
entender o que são blobs e trees
Slide 27
Slide 27 text
um blob é um objeto que contém apenas
conteúdo e é endereçável por um hash
Slide 28
Slide 28 text
ele representa o conteúdo de um arquivo
propriamente dito e nada além disso
Slide 29
Slide 29 text
o conteúdo de um blob é armazenado de
forma compactada
Slide 30
Slide 30 text
No content
Slide 31
Slide 31 text
$ f
i
nd .git/objects
.git/objects
.git/objects/a3
.git/objects/a3/968e52c871c470f1892e2feb240fb32f9cfb80
.git/objects/pack
.git/objects/info
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/f9
.git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc
Slide 32
Slide 32 text
$ git cat
-
f
i
le
-
t e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
blob
Slide 33
Slide 33 text
uma tree é um objeto que possui uma ou
mais entradas que apontam para blobs e
trees e também é endereçável por um hash
Slide 34
Slide 34 text
ela representa o agrupamento de arquivos
com informações relacionadas como nomes
de arquivos e modos de acesso
Slide 35
Slide 35 text
cada entrada de uma tree é composta por:
1. modo de acesso, 2. tipo do objeto (blob ou
tree), 3. hash do objeto e 4. nome do arquivo
Slide 36
Slide 36 text
No content
Slide 37
Slide 37 text
$ f
i
nd .git/objects
.git/objects
.git/objects/a3
.git/objects/a3/968e52c871c470f1892e2feb240fb32f9cfb80
.git/objects/pack
.git/objects/info
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/f9
.git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc
Slide 38
Slide 38 text
$ git cat
-
f
i
le
-
t f93e3a1a1525fb5b91020da86e44810c87a2d7bc
tree
Slide 39
Slide 39 text
uma tree representa uma fotogra
fi
a do
repositório em determinado momento no
tempo sem algumas informações
Slide 40
Slide 40 text
um commit é um objeto que aponta para
uma tree e possui informações relevantes
como autor e mensagem de commit
Slide 41
Slide 41 text
um commit aponta para uma tree (fotogra
fi
a do
repositório) e para o commit pai (se houver)…
Slide 42
Slide 42 text
…e contém informações relevante como nome e
e-mail do autor ou committer e data, hora e
mensagem de commit
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
$ f
i
nd .git/objects
.git/objects
.git/objects/a3
.git/objects/a3/968e52c871c470f1892e2feb240fb32f9cfb80
.git/objects/pack
.git/objects/info
.git/objects/e6
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
.git/objects/f9
.git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc
Slide 45
Slide 45 text
$ git cat
-
f
i
le
-
t a3968e52c871c470f1892e2feb240fb32f9cfb80
commit
Slide 46
Slide 46 text
o commit é um elemento de alto nível o
qual lidamos no dia-a-dia
Slide 47
Slide 47 text
ele pode ser considerado uma fotogra
fi
a do
repositório com informações relevantes em
um determinado momento no tempo
Slide 48
Slide 48 text
um conjunto de commits em ordem
cronológica é responsável por contar
a história do seu repositório
Slide 49
Slide 49 text
No content
Slide 50
Slide 50 text
O que é um
bom commit?
Slide 51
Slide 51 text
1. um commit deve ser atômico, isto é, ter
uma única alteração
Slide 52
Slide 52 text
$ git commit
-
m "cria rota de cadastro e corrige formatação"
Slide 53
Slide 53 text
2. um commit deve conter testes
Slide 54
Slide 54 text
os testes garantem que nada é quebrado
ao adicionar alterações no commit
Slide 55
Slide 55 text
3. um commit deve deixar o sistema sempre
em um estado estável
Slide 56
Slide 56 text
isto é, um commit não deve entregar algo
incompleto ou que precise de outro commit
Slide 57
Slide 57 text
isso facilita o rollback caso algo dê errado
no momento do deploy
Slide 58
Slide 58 text
$ git commit
-
m "cria rota de cadastro do usuário"
$ git commit
-
m “cria migrations da tabela”
Slide 59
Slide 59 text
4. um commit deve ter uma mensagem
clara e descritiva
Slide 60
Slide 60 text
$ git commit
-
m "corrige rota"
Slide 61
Slide 61 text
5. um commit pode referenciar uma tarefa
ou história em um sistema de rastreamento
de bugs
Slide 62
Slide 62 text
$ git commit
# no editor padrão
Cria rota de cadastro do usuário
Resolves: ISSUE-75
Slide 63
Slide 63 text
Como chegar em
um bom commit?
Slide 64
Slide 64 text
Criar um commit
atômico, com testes e
em um estado estável
Slide 65
Slide 65 text
um commit atômico quase sempre é
resultado de uma de
fi
nição adequada de
tarefas ou histórias na etapa de re
fi
namento
Slide 66
Slide 66 text
é uma boa prática criar histórias e tarefas
que representam uma única alteração no
software
Slide 67
Slide 67 text
recomenda-se criar uma branch especí
fi
ca
para cada história ou tarefa
Slide 68
Slide 68 text
$ git checkout
-
b feat/issue-75-cria
-
rota
-
de
-
cadastro
-
de
-
produto
Slide 69
Slide 69 text
$ git checkout
-
b f
i
x/issue-99-corrige
-
formatacao
-
do
-
preco
Slide 70
Slide 70 text
em uma branch especí
fi
ca você terá total
liberdade para trabalhar como quiser
Slide 71
Slide 71 text
você pode, tranquilamente, ter commits com
trabalhos incompletos já que não se trata
da versão
fi
nal de seu trabalho
Slide 72
Slide 72 text
no
fi
nal, deve-se consolidar todos os
commits em apenas um commit que
representa a entrega da funcionalidade
Slide 73
Slide 73 text
antes de criar uma pull request recomenda-
se fazer um "self code review"
Slide 74
Slide 74 text
rode ferramentas de qualidade de código
como testes automatizados, estilo de
código, linters, type checking entre outras
análises
Slide 75
Slide 75 text
se precisar corrigir algo de última hora,
utilize o comando git commit --amend
Slide 76
Slide 76 text
e, o mais importante, escreva uma
mensagem de commit que seja clara e
descritiva!
Slide 77
Slide 77 text
Escrever uma
mensagem de commit
clara e descritiva
Slide 78
Slide 78 text
o Git é uma ferramenta de documentação e
o seu histórico permite ver a evolução do
software ao longo do tempo
Slide 79
Slide 79 text
e um bom histórico depende de mensagens
de commits bem escritas
Slide 80
Slide 80 text
o sucesso de um projeto de longo prazo é
graças a sua manutenibilidade e o histórico
de commits é essencial para isso
Slide 81
Slide 81 text
a maioria das linguagens de programação
possuem convenções bem estabelecidas
para nomes, formatação e outros
Slide 82
Slide 82 text
e para mensagens de commit não é
diferente!
Slide 83
Slide 83 text
As sete regras de
uma boa mensagem
de commit
Slide 84
Slide 84 text
1. separar o título do corpo com uma linha
em branco
Slide 85
Slide 85 text
nem toda mensagem de commit precisa de
corpo
Slide 86
Slide 86 text
é normalmente utilizada em situações de
alterações simples que não precisam de
contexto
Slide 87
Slide 87 text
2. limitar o título em 50 caracteres
Slide 88
Slide 88 text
torna o título legível e força o autor a pensar
de forma mais concisa
Slide 89
Slide 89 text
se está com di
fi
culdade para resumir o
que foi feito, o commit pode ter muita
responsabilidade
Slide 90
Slide 90 text
o limite de 50 caracteres não está escrito
em pedra
Slide 91
Slide 91 text
é difícil de alcançar em idiomas como
português ou quando adiciona-se
contexto no título
Slide 92
Slide 92 text
procure tentar 50 caracteres e, se não for
possível, considere 72 caracteres como
limite máximo
Slide 93
Slide 93 text
3. começar o título com letra maiúscula
Slide 94
Slide 94 text
4. não
fi
nalizar o título com ponto
fi
nal
Slide 95
Slide 95 text
5. usar modo imperativo no título
Slide 96
Slide 96 text
fale ou escreva como se tivesse dando
um comando ou instrução
Slide 97
Slide 97 text
como nos exemplos abaixo:
- limpa o quarto
- fecha a porta
- corrige o texto
Slide 98
Slide 98 text
o modo imperativo pode parecer rude mas
o próprio Git o utiliza em suas mensagens
Slide 99
Slide 99 text
6. limitar a largura do corpo em 72
caracteres
Slide 100
Slide 100 text
o Git não realiza a quebra de linhas de
forma automática
Slide 101
Slide 101 text
se você escreve o corpo da mensagem é
sua responsabilidade realizar a quebra
manualmente
Slide 102
Slide 102 text
o seu editor ou IDE pode te auxiliar na
quebra
Slide 103
Slide 103 text
7. usar o corpo da mensagem para explicar
o que, como e por que
Slide 104
Slide 104 text
Conventional Commits
Slide 105
Slide 105 text
o conventional commits trata-se de uma
convenção simples para mensagens de
commit
Slide 106
Slide 106 text
ela fornece um conjunto de regras fácil para
criar um histórico de commit explícito…
Slide 107
Slide 107 text
…o que facilita a criação de ferramentas
automatizadas com base na especi
fi
cação
Slide 108
Slide 108 text
a convenção está de acordo com o semantic
versioning ao descrever features, fixes e
breaking changes na mensagem de commit
Slide 109
Slide 109 text
a mensagem do commit deve ter a
estrutura a seguir…
o tipo
fi
x indica a correção de um bug na
sua base de código e é equivalente ao
patch no semantic versioning
Slide 113
Slide 113 text
o tipo feat indica a introdução de uma nova
funcionalidade na sua base de código e é
equivalente ao minor no semantic versioning
Slide 114
Slide 114 text
feat: adiciona envio de email ao concluir a compra
Slide 115
Slide 115 text
f
i
x: corrige texto do botão de cadastro
Slide 116
Slide 116 text
um commit pode ser do tipo breaking
change e, para isso, deve-se adicionar um
rodapé com breaking change: ou adicionar !
depois do tipo ou escopo do commit
Slide 117
Slide 117 text
feat(api)!: adiciona campo de cpf obrigatório no cadastro
Slide 118
Slide 118 text
existem outros tipos além de
fi
x e feat
que são permitidos como build, chore,
docs e refactor
Slide 119
Slide 119 text
docs: corrige ortograf
i
a em CHANGELOG
Slide 120
Slide 120 text
style: ajusta estilo de código em CreateUser
Slide 121
Slide 121 text
os benefícios de adotar conventional
commits são muitos como…
Slide 122
Slide 122 text
1. automatizar a geração de changelogs
Slide 123
Slide 123 text
2. fazer o bump de versão de forma
automática
Slide 124
Slide 124 text
3. comunicar a natureza das alterações
para colegas de equipe, público
ou stakeholders
Slide 125
Slide 125 text
4. disparar processos de build e publicação
Slide 126
Slide 126 text
5. facilitar a compreensão do históricos de
commits do seu projeto
Slide 127
Slide 127 text
a especi
fi
cação Conventional Commit
é inspirada e baseada fortemente
no Angular Commit Guidelines
Slide 128
Slide 128 text
No content
Slide 129
Slide 129 text
Como garantir que um
commit continue bom?
Slide 130
Slide 130 text
recomenda-se criar guidelines para
a criação de commits na sua equipe
Slide 131
Slide 131 text
não é necessário seguir
fi
elmente as sete
regras ou conventional commits mas elas
são consolidadas na comunidade
Slide 132
Slide 132 text
utilize o que melhor se adaptar a sua equipe
Slide 133
Slide 133 text
pode-se utilizar ferramentas de lint como
o commitlint que veri
fi
ca se a mensagem
está de acordo com padrão
Slide 134
Slide 134 text
ou ferramentas que auxiliam na criação de
um commit como o commitzen
Slide 135
Slide 135 text
Conclusão
Slide 136
Slide 136 text
o Git vai além de uma ferramenta de
controle de versão
Slide 137
Slide 137 text
o Git é também uma ferramenta de
documentação e o seu histórico permite ver
a evolução do software ao longo do tempo
Slide 138
Slide 138 text
e um bom histórico depende de commits
atômicos, com testes e em um estado estável
e de mensagens de commits bem escritas
Slide 139
Slide 139 text
o sucesso de um projeto de longo prazo é
graças a sua manutenibilidade e o histórico
de commits é uma ferramenta essencial
Slide 140
Slide 140 text
vá em frente, crie commits incríveis e
divirta-se!