1 / 11
Modulo 4 / Git e GitHub

Commits, Branches e Merge

Branching, merge e resolução de conflitos.

school Aula 19 schedule 2 horas

Boas práticas

Mensagens de commit

close Mensagens ruins

"fix"
"atualizações"
"asdasd"
"commit final"
"alterações diversas"

check Mensagens boas

"Corrige validação do campo email"
"Adiciona página de contato"
"Remove estilos nao utilizados"
"Atualiza cores do header"
"Implementa filtro de busca"
  • Use o verbo no imperativo: "Adiciona", "Corrige", "Remove"
  • Seja específico: descreva o que mudou, nao como
  • Um commit por mudança lógica (nao misture coisas diferentes)

Histórico

Navegando nos commits

history git log

# Histórico completo $ git log # Histórico resumido (uma linha) $ git log --oneline def5678 Adiciona página de contato abc1234 Estrutura inicial do site # Histórico com gráfico visual $ git log --oneline --graph

difference git diff

# Ver mudanças nao adicionadas $ git diff # Ver mudanças já preparadas (staged) $ git diff --staged # Comparar dois commits $ git diff abc1234 def5678
lightbulb Linhas em verde (+) foram adicionadas. Linhas em vermelho (-) foram removidas.

Ramificações

O que são branches?

fork_right Linhas paralelas de desenvolvimento

  • Uma branch é uma "linha do tempo" independente
  • Permite trabalhar em funcionalidades sem afetar o código principal
  • A branch padrão se chama main (ou master)
  • Cada branch pode ter seus próprios commits

account_tree Visualização

main: A---B---C-------F
\ /
feature: D---E

main: código estável e em produção

feature: nova funcionalidade em desenvolvimento

Quando a feature está pronta, juntamos (merge) com a main

Comandos

Trabalhando com branches

add Criar e listar

# Listar todas as branches $ git branch * main # Criar uma nova branch $ git branch pagina-contato # Criar e já mudar para ela $ git checkout -b pagina-contato # ou (mais moderno) $ git switch -c pagina-contato

swap_horiz Trocar e deletar

# Mudar para outra branch $ git checkout main # ou (mais moderno) $ git switch main # Deletar uma branch já mergeada $ git branch -d pagina-contato # Forçar delete (cuidado!) $ git branch -D branch-abandonada
lightbulb Prefira git switch ao invés de git checkout para trocar branches. É mais claro e moderno.

Na prática

Fluxo com branches

# 1. Estar na main atualizada $ git switch main # 2. Criar branch para a nova feature $ git switch -c pagina-contato # 3. Trabalhar normalmente (editar arquivos) # ... edita contato.html, style.css ... # 4. Adicionar e commitar $ git add . $ git commit -m "Adiciona página de contato" # 5. Mais alterações, mais commits $ git add . $ git commit -m "Adiciona formulário de contato" # 6. Voltar para main e fazer o merge $ git switch main $ git merge pagina-contato # 7. Deletar a branch (opcional) $ git branch -d pagina-contato

Juntando código

O que é merge?

merge Fast-forward

Antes:
main: A---B
feature: C---D
Depois do merge:
main: A---B---C---D

Quando a main nao teve novos commits, o Git simplesmente "avança" o ponteiro. Nenhum commit extra é criado.

call_merge Merge commit

Antes:
main: A---B---E
\
feature: C---D
Depois do merge:
main: A---B---E---F
\ /
feature: C---D

Quando ambas as branches têm novos commits, o Git cria um commit de merge (F) que junta os dois históricos.

Problemas

Resolução de conflitos

warning Quando acontece?

  • Duas branches modificaram a mesma linha do mesmo arquivo
  • O Git nao sabe qual versão manter
  • Precisa da decisão humana para resolver
O que o Git mostra no arquivo:
<<<<<<< HEAD <h1>Bem-vindo ao site</h1> ======= <h1>Olá, visitante!</h1> >>>>>>> feature

build Como resolver

1 Abra o arquivo com conflito no editor
2 Escolha qual versão manter (ou combine as duas)
3 Remova os marcadores (<<<, ===, >>>)
4 Salve, faça git add e git commit
# Após resolver manualmente: $ git add index.html $ git commit -m "Resolve conflito no título"

Salvação

Desfazendo mudanças

undo Descartar mudanças

# Descartar mudanças de # um arquivo (nao commitadas) $ git checkout -- index.html # ou (mais moderno) $ git restore index.html

remove_circle Tirar do stage

# Remover do staging # (manter a mudança) $ git reset HEAD index.html # ou (mais moderno) $ git restore --staged index.html

history Corrigir commit

# Corrigir a mensagem do # último commit $ git commit --amend -m "Nova mensagem" # Incluir arquivo esquecido $ git add esquecido.css $ git commit --amend --no-edit

Hora de praticar

Exercício prático

rocket_launch Branches e merge

  1. Use o repositório da aula anterior (ou crie um novo com git init)
  2. Verifique que está na main com git branch
  3. Crie uma branch pagina-sobre e mude para ela
  4. Crie um arquivo sobre.html, adicione e faça commit
  5. Volte para a main e observe que sobre.html nao existe
  6. Faça o merge da branch pagina-sobre na main
  7. Verifique que sobre.html agora aparece na main
lightbulb Desafio extra: crie um conflito propositalmente (edite a mesma linha em branches diferentes) e resolva manualmente.
Próxima aula

Aula 20

GitHub: repositórios remotos, push, pull e pull requests.

task_alt O que aprendemos hoje

  • check_circle Boas práticas para mensagens de commit
  • check_circle git log, git diff e navegação no histórico
  • check_circle Branches: criar, trocar e deletar
  • check_circle Merge (fast-forward e merge commit)
  • check_circle Resolução de conflitos e comandos para desfazer
Próxima aula
auto_stories Referência: Pro Git Book (PT-BR)
Leandro Medeiros