Git e Gitflow

Guilherme Puida

2025-03-12

Quem sou eu

  • Desenvolvedor Place TI desde 2022.
  • Engenharia de Software - UnB.
  • Debian Maintainer - go, python, hare.

git

$ man git | grep ^NAME$ -A 1
NAME
       git - the stupid content tracker

Origem - Linux Kernel

  • 1991 - 2002: Patches por email.
  • 2002 - 2005: BitKeeper.
  • 2005 - agora: git.

Motivação

  1. FOSS - Free and Open Source Software.
  2. Distribuído.
  3. Rápido.
  4. Escalável.

Diferenças para outros VCSs

  1. Quase todas as operações são realizadas localmente.
  2. Usa snapshots em vez de deltas.
  3. Permite que cada desenvolvedor possua sua cópia local do repositório.

Porcelana e Encanamento

Os comandos do git são divididos em duas categorias:

  • Porcelana: comandos de alto nível, usados no dia-a-dia.
    • add, diff, commit, push, pull, merge, rebase, …
  • Encanamento: comandos de baixo nível, utilizados para implementar a porcelana.
    • merge-file, hash-object, update-ref, mktree, …

Workflow básico

  1. pull
  2. add
  3. commit
  4. push

Boas práticas

Commits atômicos

Princípio da responsabilidade única.

Boas mensagens de commit

É importante seguir um padrão.

commit b60ac54861f7a321b74740445e1b384dddc2cfbd
Author: Guilherme Moreira <guilherme.moreira@placeti.com.br>
Date:   Mon Jan 6 11:15:42 2025 -0300

    [2296] fix: não aplica descontos para anuidades de 2024 migradas

    Quando um débito é legado, usamos a configuração vigente para o
    regional. Usamos essa configuração para obter a data de vencimento da
    anuidade, para definir os descontos que são enviados para o Banco do
    Brasil.

Código sempre buildável

Útil para git bisect.

Comandos úteis

(mas que poucas pessoas usam)

git reflog

Log de todas as ações realizadas na cópia local do repositório. Útil quando alguma coisa quebra e você não sabe como resolver.

man git-reflog

git reset/restore/revert

  • reset: para atualizar a branch, adicionando ou removendo commits. Essa ação altera o histórico de commits.
  • restore: restaura arquivos da working tree com os conteúdos do index ou de outro commit/tag/branch. Essa ação não atualiza sua branch nem altera o histórico de commits.
  • revert: faz um novo commit que reverte as mudanças de um commit anterior.
man git | grep "Reset, restore and revert" -A 10

git bisect

Busca biária para encontrar o commit que introduziu um bug ou novo comportamento.

man git-bisect

git stash

Guarda as modificações atuais e volta para o estado limpo da árvore.

man git-stash

Comandos que eu mais uso

  1. git add --patch
  2. git add --interactive
  3. git status --short
  4. git switch -
  5. git restore --staged
  6. git diff --staged
  7. git rebase --interactive --autostash --autosquash
  8. git log --patch

GitFlow

Estratégia de branching, introduzida em 2010 por Vincent Driesses.

Isolar o seu desenvolvimento em tipos distintos de branch

Os cinco tipos de branch

  1. main
  2. develop
  3. feature
  4. release
  5. hotfix

main

Código pronto para produção.

develop

Código pré-produção, com novas features desenvolvidas e que estão no processo de teste.

feature

Branch temporária, usada para adicionar novas features. Tipo de branch mais comum.

release

Usada para preparar uma nova release. Tipicamente é alvo de pequenos bugfixes específicos para a próxima versão em produção.

Permite que o desenvolvimento principal (que deve ser na develop) seja isolado.

hotfix

Usado para correções na main, sem ter que passar pela develop antes.

Exemplo

  1. main
  2. develop
  3. release/1.0develop
  4. hotfix/bug-criticomain
  5. feature/novo-botaodevelop

Referências