Este projeto é parte do Módulo Geral do programa Vem Ser DBC, baseado no material de GIT, formulado pela instrutora Cristina Jung.
Este documento serve como um guia prático e colaborativo sobre os principais comandos do Git, detalhando funcionamento, sintaxe e aplicação.
👥 Integrantes: A lista completa dos membros do grupo encontra-se no arquivo
README-info.md.
Seguimos o fluxo de branches: feat/* ➡️ develop ➡️ hml ➡️ main.
| Branch | Função |
|---|---|
main |
🚀 Produção (Código estável e finalizado). |
hml |
🧪 Homologação (Ambiente de testes do grupo). |
develop |
🚧 Desenvolvimento (Integração das features). |
- Crie uma branch a partir da
develop:git checkout -b feat/documentacao-X(onde X é a letra do seu comando). - Vá até a seção do seu comando neste arquivo.
- Substitua o texto
(Aguardando conteúdo...)pelas informações técnicas. - Não altere as seções dos colegas para evitar conflitos.
- Faça o Push e abra o Pull Request para
develop.
- Git Rebase
- Git Cherry Pick
- Git Revert
- Git Squash
- Git Reset
- Git Merge
- Git Log
- Git Checkout
- Git Commit
- Git Fetch e Git Pull
O que é: O git rebase é um comando do Git que permite integrar alterações de um branch em outro de uma forma linear e limpa. Ao contrário do git merge, que por padrão cria um novo commit de mesclagem. A ideia fundamental do git rebase é reaplicar os commits de um branch sobre o topo de outro.
💻 Sintaxe:
git rebase [parametros]
# Exemplos de parâmetros mais usados:
git rebase develop # Reaplica seus commits no topo da develop
git rebase -i HEAD~N # Modo interativo (para juntar/editar os últimos N commits)
git rebase --continue # Continua o processo após resolver um conflito
git rebase --abort # Cancela a operação e volta ao estado original🎯 Quando usar:
- Limpeza de Histórico: Ao invés de criar um commit de merge, que apenas registra que você fez a fusão, o rebase move seu trabalho para o topo. Isso faz com que seu branch pareça ter sido criado após as últimas alterações, resultando em um histórico mais limpo.
-
Conflitos: Se ocorrer um conflito de mesclagem durante esse processo, o
git rebaseserá interrompido no primeiro commit problemático e deixará marcadores de conflito.Como resolver: Corrija o arquivo, use
git add .(não faça commit!) e rodegit rebase --continue. -
Regra de Ouro: Jamais faça rebase em branches públicas (como
developoumain). Isso reescreve o histórico compartilhado e quebrará o trabalho dos outros integrantes.
O que é: Um comando cuja função é copiar as mudanças introduzidas por um único commit e aplica-las como um novo commit na branch em que você está.
💻 Sintaxe:
```bash
git cherry-pick [hash-do-commit]
# Exemplos de parâmetros mais usados:
git cherry-pick a1b2c3d # Aplica o commit específico pelo Hash
git cherry-pick a1b2c3d..f4g5h6i # Aplica um intervalo de commits
git cherry-pick --abort # Cancela a operação em caso de conflito🎯 Quando usar: O cherry-pick é a melhor solução quando você precisa isolar uma mudança específica sem trazer toda a complexidade ou instabilidade de uma branch inteira.
- Hotfixes (Correções Urgentes): Trazer um commit de correção de bug de uma branch de feature inacabada diretamente para a branch de produção (main).
- Movendo um Commit Acidental: Você comitou algo na branch-A que deveria ter sido comitado na branch-B. Use o
cherry-pickpara copiá-lo para branch-B.
O principal problema do cherry-pick é que ele duplica o commit, o que pode complicar a gestão do histórico a longo prazo. O commit original e o commit copiado terão hashes diferentes, mas as mesmas alterações. Isso pode confundir ferramentas de comparação de histórico e dificultar a mesclagem futura, pois o Git não reconhece automaticamente que um commit é a cópia do outro.
O que é: O
git reverté o comando usado para desfazer as alterações introduzidas por um commit específico. Em vez de remover o commit da história (o que reescreveria o histórico, como faria o git reset), ogit revertcria um novo commit chamado Reverting Commit. Este Novo Commit aplica as alterações inversas (ou opostas) do commit que você deseja desfazer. Se o commit original adicionou uma linha de código, o reverting commit irá removê-la. Se o original removeu, o reverting commit irá adicioná-la de volta. O histórico de commits é preservado, tornando o git revert a forma mais segura de desfazer alterações em branches públicas (que já foram compartilhadas com outras pessoas).
💻 Sintaxe:
git revert [hash-do-commit]
# Exemplos de parâmetros mais usados:
git revert 9a3c7f1 # Desfaz as alterações do commit com o hash específico
git revert HEAD~1 # Desfaz o commit anterior ao HEAD
git revert --no-commit # Reverte as alterações no código, mas não cria o commit automaticamente🎯 Quando usar: O git revert é a ferramenta padrão para desfazer alterações de forma segura em ambientes colaborativos.
-
Desfazer Commits em Branches Compartilhadas/Públicas: Use revert sempre que precisar desfazer alterações em branches como main, master ou release, pois ele não reescreve o histórico, evitando problemas para os colegas que já baixaram esse histórico.
-
Remover funcionalidades incompletas: Um commit que introduziu um recurso que não está funcionando corretamente pode ser revertido sem a necessidade de reescrever manualmente o código.
-
Correção de Erros Acidentais: Desfazer um commit que introduziu um bug sério, mantendo o registro de que ele existiu e foi corrigido.
-
Múltiplos Reverts: Se você reverter um commit e, mais tarde, tentar revertê-lo novamente, o Git pode ter dificuldade em aplicar as alterações opostas, podendo gerar um commit vazio (Empty Revert).
-
Conflitos de Reversão: Se o commit que você está revertendo alterou código que foi modificado por commits posteriores (e que já estão na sua branch), o revert pode pausar para que você resolva conflitos de merge antes de continuar ou abortar.
O que é: Git Squash é o processo de combinar vários commits em um único commit.
💻 Sintaxe:
# Opção 1: Durante um merge (junta tudo num commit só na branch atual)
git merge --squash [nome-da-branch]
# Opção 2: Durante um rebase interativo (para escolher quais commits juntar)
git rebase -i HEAD~[numero-de-commits]
# (No editor que abrir, troque 'pick' por 'squash' ou 's' nos commits desejados)🎯 Quando usar: Quando a branch de feature tem muitos commits pequenos e irrelevantes (ex: "ajuste", "typo", "wip") e você quer juntar tudo em um único commit significativo antes de integrar. Ou quando quer reorganizar e limpar commits durante um rebase interativo para deixar a leitura do histórico mais fluida.
- O
Squashreescreve o histórico criando um novo hash. Portanto, não faça squash em commits que já foram publicados e estão sendo usados por outras pessoas (branches compartilhadas), pois isso quebrará a sincronia do time.
O que é:
Git Reseté o comando usado para desfazer mudanças, movendo o ponteiro do HEAD e, opcionalmente, alterando o estado da área de staging e do working directory. Ele serve para “voltar no tempo” dentro do histórico da sua branch.
💻 Sintaxe:
git reset [parametros]
# Principais Modos (onde N é o número de commits a voltar):
git reset --soft HEAD~N # Desfaz o commit, mas mantém as alterações no stage
git reset --mixed HEAD~N # (Padrão) Desfaz o commit e a stage (devolve p/ working directory)
git reset --hard HEAD~N # PERIGO: Apaga o commit, a stage e as alterações locais🎯 Quando usar:
-
Desfazer Commit: Quando você quer desfazer commits, mas manter as alterações no código para refazer ou descartar (uso de
--softou--mixed). -
Limpar Staging: Quando fez um
git add .por engano e só quer tirar arquivos da área de staging. -
Descartar Tudo: Quando quer descartar completamente alterações locais não-commitadas e voltar a um estado limpo de um commit anterior (
--hard). -
Histórico Local: Para limpar o histórico local (commits não enviados) antes de refazer commits corretamente.
-
Destrutivo (
--hard): Cuidado extremo comgit reset --hard: ele apaga alterações do working directory e não há como recuperá-las, a menos que você use ferramentas avançadas. -
Histórico Compartilhado: Evite usar
git resetem commits que já foram enviados (git push) para o repositório remoto — isso reescreve o histórico e exige umgit push --forcedo seu lado, o que atrapalha outras pessoas. -
Escopo:
git resetsó afeta sua branch local; a develop no servidor não será alterada.
O que é: O comando
mergecombina as alterações de uma branch em outro, preservando o histórico completo da versão. Ele unifica o histórico de commits de ambas as branches.
💻 Sintaxe:
git merge [nome-da-branch]
# Exemplos de parâmetros mais usados:
git merge feature/login # Mescla a branch 'feature/login' na branch atual
git merge --no-ff feature/login # Força a criação de um commit de merge (preserva o histórico da feature)
git merge --abort # Cancela o processo de merge em caso de conflitos🎯 Quando usar: Esse comando faz um merge da branch especificada para a branch em que você está no momento. Sempre que quiser unir o histórico de duas branches sem reescrever nada, ou seja, quando você quer preservar a linha do tempo real do projeto.
-
Conflitos de Arquivo: Se as mesmas linhas foram alteradas nas duas branches, o Git pausará o processo. Você deve editar o arquivo, escolher o código final, usar
git add .e, por fim,git commitpara finalizar o merge. -
Alterações Pendentes: Se houver alterações cujo
commitnão foi realizado em sua branch atual, o Git não permitirá fazer o merge até que todas as alterações de sua branch atual sejam salvas (commitadas).
O que é: O
git logé o comando utilizado para exibir o histórico de commits do repositório. Ele mostra informações como hash do commit, autor, data, mensagem e detalhes sobre merges e alterações, permitindo acompanhar toda a evolução do projeto.
💻 Sintaxe:
git log [parametros]
# Exemplos de parâmetros mais usados:
git log # Exibe o histórico completo (um commit por vez)
git log --oneline # Mostra o histórico resumido (Hash e mensagem em uma linha)
git log --graph # Mostra um gráfico ASCII das ramificações (branches) e merges
git log --author="Nome" # Filtra commits por autor
git log --since="2 days ago" # Filtra por data
git log -p # Mostra o diff (o que mudou) em cada commit🎯 Quando usar:
- Revisão de Histórico: Para consultar o histórico de alterações completo do projeto, garantindo que tudo está correto antes do deploy.
- Análise de Branches: Para analisar merges e a evolução das branches usando o parâmetro
--graph. - Localização de Hash: Para encontrar o Hash (ID) de commits específicos que serão usados posteriormente em
revert,resetoucherry-pick. - Relatórios: Para filtrar commits por autor ou data, facilitando a auditoria.
Leitura em Projeto Grande: O git log pode gerar muitas linhas em projetos grandes. Utilize opções como --oneline ou filtros por autor/data (--author="Nome") para facilitar a leitura e a navegação no terminal.
O que é: É o comando utilizado para alternar entre branches (ramificações) ou para restaurar arquivos da árvore de trabalho. Ele atualiza os arquivos do seu diretório atual para corresponderem à versão armazenada na branch ou no commit que você selecionou.
💻 Sintaxe:
git checkout [parametro]
# Alterna para uma branch existente
git checkout develop
# Cria e troca imediatamente para uma nova branch
git checkout -b feature/nova
# Descarta alterações locais de um arquivo (restaura para o último commit)
git checkout -- nome-do-arquivo🎯 Quando usar:
-
Navegação: Para navegar entre diferentes contextos de desenvolvimento (por exemplo, sair da branch develop e ir para uma branch de feature).
-
Criação Rápida: Para criar uma nova branch e já começar a trabalhar nela (
git checkout -b). -
Descarte Pontual: Para descartar alterações locais em um arquivo específico, revertendo-o para o estado do último commit.
-
Perda de Dados: Tenha muito cuidado ao usar
git checkout [nome-do-arquivo]. Se você fizer isso, todas as alterações locais não commitadas nesse arquivo serão perdidas permanentemente, pois ele será sobrescrito pela versão do último commit. -
Bloqueio de Troca: Se você tiver alterações não commitadas em arquivos que seriam afetados pela troca de branch, o Git pode bloquear o checkout para prevenir perda de dados.
O que é: O comando
git commitcria um registro permanente das alterações que estão na staging area. Ele salva um novo ponto na linha do tempo do projeto permitindo rastrear mudanças, entender evolução e voltar atrás quando necessário.
💻 Sintaxe:
git commit -m "mensagem"
# Sintaxe mais comuns:
git commit -m "feat: [mensagem]" # Cria commit com mensagem
git commit -am "mensagem" # Adiciona arquivos modificados (já trackeados) e commita
git commit --amend # Permite editar o último commit (mensagem e/ou arquivos)🎯 Quando usar:
-
Registro Permanente: Quando finaliza uma parte do código e deseja registrar essa alteração no histórico de forma permanente.
-
Ponto de Salvamento: Após adicionar arquivos com
git add .(staging area) e antes de fazergit pushpara o repositório remoto.
-
Mensagens e Padrão: As mensagens do commit devem ser claras, objetivas e, crucialmente, seguir o Padrão de Nomenclatura (Conventional Commits) definido pelo time.
-
Atomicidade: Cada commit deve abordar uma única unidade lógica de trabalho (ex: "corrigir bug X"). Evite misturar correções, features e ajustes de estilo no mesmo commit.
O que é: O
git fetchbaixa commits, arquivos e referências de um repositório remoto para o seu local, mas não mescla nada no seu trabalho atual (é apenas uma atualização de informações). Já ogit pullé a combinação de dois comandos: ele executa umgit fetchpara baixar os dados e, imediatamente, umgit mergepara atualizar sua branch atual com o conteúdo baixado.
💻 Sintaxe:
# Baixa atualizações do remoto (seguro, não altera seu código)
git fetch origin
# Baixa e tenta mesclar automaticamente na sua branch atual
git pull origin [nome-da-branch]🎯 Quando usar:
-
Use
git fetchpara ver o que seus colegas fizeram (inspecionar mudanças) antes de decidir integrá-las ao seu código. -
Use
git pullsempre que começar a trabalhar (para garantir que suadevelopestá atualizada) ou para trazer alterações aprovadas para sua máquina.
O git pull pode gerar conflitos de merge imediatos se o seu trabalho local for incompatível com o remoto. Se estiver inseguro, prefira usar git fetch seguido de git merge manualmente.