Slide 1

Slide 1 text

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…

Slide 110

Slide 110 text

[escopo opcional] : [corpo opcional] [cabeçalho(s) opcional(is)]

Slide 111

Slide 111 text

os tipos de commits mais comuns são fi x e feat

Slide 112

Slide 112 text

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!

Slide 141

Slide 141 text

Referências

Slide 142

Slide 142 text

bit.ly/palestra-commits-incriveis

Slide 143

Slide 143 text

Avalie!

Slide 144

Slide 144 text

@marcelgsantos speakerdeck.com/marcelgsantos Obrigado. Perguntas?