🐙 Git e GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Data de Publicação

31 de agosto de 2025

Comandos básicos e avançados do Git para controlo de versões, branches, repositórios remotos, stash, tags e GitHub CLI.

🔹 Comandos Básicos

Comando

Exemplo

Descrição

git add Adicionar um ficheiro à área de staging
git add file.txt

Adicionar um ficheiro específico para o próximo commit

git add .

Adicionar todas as alterações no diretório atual e subdiretórios

git add -p

Escolher interativamente que partes de ficheiros adicionar (útil para commits parciais)

git clone Clonar um repositório para um novo diretório
git clone -b branch_name URL

Clonar apenas a branch especificada (em vez da predefinida)

git clone --depth 1 URL

Clonar apenas o último commit, criando uma cópia superficial para poupar tempo e espaço

git commit Registar alterações no repositório
git commit -m "Initial commit"

Commit com mensagem sem abrir o editor

git commit -a -m "Fix bugs"

Adicionar e fazer commit de todos os ficheiros modificados com uma mensagem

git commit --amend

Atualizar o último commit (alterar mensagem ou incluir mais alterações)

git commit --fixup abc1234

Criar um commit fixup para ser automaticamente squash durante rebase interativo

git config Obter e definir opções do repositório ou globais
git config --global user.name "Name"

Definir nome de utilizador global do Git

git config --global user.email "email@example.com"

Definir email global do Git

git config --list

Listar todas as definições do Git (nome, email, editor, etc.)

git diff Mostrar alterações entre commits, commit e working tree, etc.
git diff HEAD

Mostrar o que mudou desde o último commit (alterações não adicionadas)

git diff --staged

Mostrar o que será incluído no próximo commit

git diff --word-diff HEAD~1

Mostrar alterações com diferenças a nível de palavras

git grep Procurar dentro dos ficheiros do repositório
git grep "functionName"

Encontrar todas as menções de functionName em todos os ficheiros do projeto

git grep -n "TODO"

Encontrar linhas contendo TODO e mostrar números de linha (útil para encontrar notas no código)

git grep -i "login"

Procurar a palavra login sem diferenciar maiúsculas/minúsculas

git init Criar um repositório Git vazio ou reinicializar um existente
git init my-project

Inicializar um novo repositório no diretório my-project

git init --bare

Inicializar um repositório bare

git log Mostrar logs de commits
git log --oneline

Mostrar histórico de commits em formato compacto (uma linha)

git log --graph --all

Mostrar todas as branches em gráfico visual de commits

git log -p --stat

Mostrar patch e estatísticas de alterações por commit

git reset Remover ficheiros da staging area, mantendo alterações no diretório de trabalho
git reset HEAD file.txt

Remover um ficheiro da staging (mantendo as edições)

git reset --hard HEAD~1

Voltar um commit atrás e apagar todas as alterações (irreversível!)

git reset --soft HEAD~1

Desfazer o último commit mas manter alterações prontas para novo commit

git reset --mixed HEAD~1

Desfazer um commit mas manter alterações não adicionadas no diretório de trabalho

git show Mostrar vários tipos de objetos
git show <commit_hash>

Mostrar alterações e mensagem de um commit específico

git show HEAD~1

Mostrar o commit anterior ao atual

git show --stat

Mostrar resumo das alterações de ficheiros no último commit

git status Mostrar o estado da árvore de trabalho
git status -s

Mostrar estado em formato curto

git status -b

Mostrar branch atual e estado dos ficheiros

🌿 Branches e Merge

Comando

Exemplo

Descrição

git branch Criar, listar ou apagar branches
git branch new-feature

Criar uma nova branch chamada new-feature

git branch -d old-feature

Apagar uma branch local chamada old-feature

git checkout Mudar de branch ou restaurar ficheiros de outro commit
git checkout main

Mudar para a branch main

git checkout -b new-branch

Criar e mudar para uma nova branch chamada new-branch

git switch Mudar de branch (alternativa simplificada ao checkout)
git switch main

Mudar para a branch main

git switch -c feature-x

Criar e mudar para uma nova branch chamada feature-x

git switch new-feature

Mudar para uma branch existente chamada new-feature

git merge Combinar alterações de outra branch na atual
git merge new-feature

Fazer merge da branch new-feature na branch atual

git merge --no-ff new-feature

Forçar a criação de commit de merge (mesmo que fast-forward seja possível)

git merge --abort

Cancelar merge e reverter alterações em caso de conflitos

git rebase Mover ou reaplicar commits sobre um novo commit base
git rebase main

Reaplicar commits da tua branch sobre a branch main

git rebase -i HEAD~3

Editar interativamente os últimos 3 commits

git rebase --abort

Parar e desfazer um rebase em andamento

git rebase -i --autosquash HEAD~5

Squash automático de commits marcados como fixup ou squash durante rebase interativo

git cherry-pick Aplicar commits específicos de outra branch
git cherry-pick <hash>

Aplicar um commit específico (por hash) na branch atual

git cherry-pick --continue

Continuar cherry-pick após resolver conflitos

git cherry-pick A^..B

Aplicar um intervalo de commits de A (excluído) até B (incluído)

📡 Repositórios Remotos

Comando

Exemplo

Descrição

git remote Gerir ligações a repositórios remotos (como GitHub)
git remote -v

Mostrar nomes de remotos e os seus URLs

git remote add origin URL

Adicionar um repositório remoto chamado origin

git pull Descarregar e fazer merge automático de alterações de uma branch remota
git pull origin main

Buscar e fundir alterações da branch remota main na branch atual

git pull --rebase origin main

Buscar e rebasear a branch atual sobre a remota em vez de fazer merge

git push Enviar alterações locais para um repositório remoto
git push origin main

Enviar a branch local main para o remoto origin

git fetch Descarregar alterações do remoto sem fazer merge
git fetch origin

Buscar todas as atualizações do remoto origin, mas não aplicar ainda

git fetch origin main

Buscar apenas a branch main do remoto

git fetch --all

Buscar atualizações de todos os remotos

git fetch --prune

Limpar branches apagadas — remover referências locais a branches eliminadas remotamente

git fetch --dry-run

Mostrar o que seria descarregado sem realmente baixar nada

git fetch origin +main

Forçar atualização da branch local de tracking (origin/main), sobrescrevendo conflitos

📦 Stash e Limpeza

Comando

Exemplo

Descrição

git stash Guardar temporariamente alterações não commitadas (work in progress)
git stash

Guardar ficheiros modificados/adicionados e reverter diretório de trabalho para último commit

git stash apply

Reaplicar as últimas alterações em stash (stash permanece guardado)

git stash pop

Reaplicar e remover o último stash

git stash list

Mostrar lista de todas as alterações em stash

git stash branch feature-fix

Criar uma nova branch e aplicar-lhe o último stash

git clean Eliminar permanentemente ficheiros não rastreados (fora do Git)
git clean -f

Eliminar ficheiros não rastreados no diretório atual

git clean -fd

Eliminar ficheiros e pastas não rastreados

git clean -n

Pré-visualizar o que será apagado (execução segura)

🏷️ Tags

Comando

Exemplo

Descrição

git tag Criar, listar ou apagar tags para marcar pontos específicos na história (como releases)
git tag -a v1.0 -m "Version 1.0"

Criar uma tag anotada chamada v1.0 com mensagem (guardada como objeto completo do Git, bom para releases)

git tag -d v1.0

Apagar a tag local v1.0 (não afeta remoto)

git push Enviar commits, branches e tags do repositório local para remoto
git push origin --tags

Enviar todas as tags locais para o remoto (útil após criar várias versões)

git push origin v1.0

Enviar uma tag específica (ex: v1.0) para o repositório remoto

git push origin :refs/tags/v1.0

Apagar a tag remota v1.0 (usar sintaxe com dois pontos)

🛠️ Resolução de Conflitos

Comando

Exemplo

Descrição

git mergetool Abrir ferramenta visual para ajudar a resolver conflitos de merge
git mergetool --tool=meld

Usar ferramenta específica (como Meld) para corrigir conflitos

git rerere Permitir que o Git memorize como resolveste conflitos anteriormente
git config --global rerere.enabled true

Ativar reutilização automática de resoluções anteriores

git rerere status

Mostrar quais ficheiros têm resoluções de conflitos guardadas

git rerere diff

Mostrar alterações que o Git guardou para reutilização futura

⚙️ Comandos Avançados

Comando

Exemplo

Descrição

git bisect Usar pesquisa binária para encontrar o commit que introduziu um bug
git bisect start

Iniciar pesquisa binária entre um commit bom e um mau para localizar bug

git bisect bad

Marcar commit atual como “mau” (contém o bug)

git bisect good <commit>

Marcar commit conhecido como “bom” onde bug não existia

git blame Mostrar quem modificou cada linha de um ficheiro pela última vez, com revisão e autor
git blame file.txt

Mostrar autor e informação de commit para cada linha do ficheiro

git blame -L 10,20 file.txt

Mostrar blame apenas para linhas 10 a 20

git blame --show-email file.txt

Mostrar emails dos autores junto das alterações

git reflog Ver e gerir o reflog (movimentos de branches e HEAD)
git reflog show main@{1.week.ago}

Ver onde a branch main apontava há uma semana

git reflog expire --expire=30.days --dry-run

Pré-visualizar entradas de reflog mais antigas que 30 dias que podem ser limpas

git reflog delete HEAD@{2}

Apagar entrada específica do reflog (usar com cuidado, pode afetar recuperação)

git submodule Adicionar, inicializar, atualizar ou inspecionar submódulos (repositórios dentro de repositórios)
git submodule add URL path

Adicionar um repositório externo como submódulo num caminho específico

git submodule update --init

Inicializar e descarregar todos os submódulos listados no repositório

git submodule foreach git pull

Executar git pull dentro de cada submódulo para atualizar para último commit

git submodule sync --recursive

Sincronizar URLs de submódulos após alterações em .gitmodules

git submodule update --remote --merge

Atualizar submódulos para o último commit das branches remotas

git archive Criar um arquivo (zip, tar, etc.) de ficheiros de um commit ou branch específico
git archive --format=zip HEAD > archive.zip

Criar arquivo ZIP dos ficheiros atuais no HEAD

git archive -o release.tar.gz HEAD

Criar arquivo comprimido .tar.gz do HEAD atual

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

Criar .tar.gz com ficheiros do projeto atual, colocando tudo dentro da pasta project/

git gc Limpar ficheiros desnecessários e otimizar o repositório para desempenho
git gc --aggressive

Executar limpeza e otimização completa (pode ser lenta mas eficaz)

git gc --prune=now

Remover imediatamente todos os objetos inacessíveis (perigoso se não tiver certeza)

git shortlog Resumo rápido de autores e seus commits
git shortlog -e

Mostrar lista de autores com emails (ex: para analisar contribuições)

git shortlog -s -n

Mostrar quantos commits cada autor fez, ordenado por número de commits

git shortlog -sne

O mesmo, mas incluindo nomes e emails — útil para rastrear atividade detalhada

git revert Criar um novo commit que desfaz alterações de um commit anterior sem reescrever histórico
git revert HEAD

Desfazer o último commit criando novo commit que reverte alterações

git revert <commit_hash>

Desfazer commit específico por hash, adicionando commit de reversão em segurança

🐙 GitHub CLI

gh permite gerir o GitHub a partir do terminal.

Comando

Exemplo

Descrição

gh auth login Autenticar-se com um host do GitHub para permitir que os comandos da CLI interajam com a sua conta
gh auth login --with-token < mytoken.txt

Autenticar usando um personal access token armazenado num ficheiro (mytoken.txt)

gh auth login --hostname enterprise.internal

Autenticar-se num servidor GitHub Enterprise (não github.com)

gh repo clone Clonar um repositório GitHub para a sua máquina local
gh repo clone user/repo

Clonar o repositório repo do utilizador user para uma pasta chamada repo

gh repo clone cli/cli -- --depth=1

Clonar o repositório mas descarregar apenas o último commit para clonagem mais rápida e leve

gh repo clone cli/cli workspace/cli

Clonar o repositório para uma pasta personalizada workspace/cli

gh issue list Listar issues num repositório GitHub, opcionalmente filtradas por vários critérios
gh issue list --assignee "@me"

Listar issues atribuídas a si

gh issue list --state all

Listar issues independentemente do estado (abertas ou fechadas)

gh issue list --search "error no:assignee sort:created-asc"

Listar issues que contenham “error”, não atribuídas, ordenadas por data de criação ascendente

gh pr create Criar um pull request no GitHub via CLI
gh pr create --title "..."

Criar um pull request com o título indicado

gh pr create --project "Roadmap"

Associar o pull request a um projeto GitHub chamado “Roadmap”

gh pr create --base develop --head monalisa:feature

Criar um PR da branch feature do fork monalisa para a branch develop

gh repo create Criar um novo repositório GitHub a partir da CLI
gh repo create my-project

Criar um novo repositório chamado my-project no GitHub (seguem prompts interativos)

gh repo create my-project --public --clone

Criar um repositório público e cloná-lo localmente

gh repo create my-project --private --source=. --remote=upstream

Criar um repositório remoto privado a partir da pasta atual e adicionar remoto chamado upstream

💡 Aliases do Git (Atalhos Úteis)

Configurar aliases convenientes para acelerar comandos Git comuns:

git config --global alias.br branch                                       # atalho para: git branch
git config --global alias.ci commit                                       # atalho para: git commit
git config --global alias.co checkout                                     # atalho para: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # gráfico de histórico legível
git config --global alias.last "log -1 HEAD"                              # mostrar o último commit
git config --global alias.st status                                       # atalho para: git status

🚀 Comandos Avançados de Git para Profissionais

Comando

Exemplo

Descrição

git filter-repo Ferramenta poderosa e eficiente para reescrever o histórico Git para remover ou modificar ficheiros, autoria ou caminhos; substitui o git filter-branch com mais velocidade e segurança
git filter-repo --path secret.txt --invert-paths

Reescrever eficientemente o histórico do repositório para remover ficheiros ou diretórios sensíveis sem problemas de performance do git filter-branch. Usar com cuidado

git filter-repo --replace-text replacements.txt

Substituir em massa strings ou padrões em todo o histórico (ex: sanitizar credenciais)

git filter-repo --subdirectory-filter src

Extrair histórico de um subdiretório para um novo repositório, preservando metadados de commits

git worktree Gerir múltiplos diretórios de trabalho ligados a um único repositório, permitindo trabalho paralelo em diferentes branches sem clonar
git worktree add ../feature feature-branch

Criar um diretório de trabalho adicional ligado ao mesmo repositório, permitindo checkouts paralelos de branches sem clones

git worktree list

Listar todos os worktrees ativos, os seus caminhos e branches associadas

git worktree remove ../feature

Remover um worktree ligado quando já não for necessário, limpando diretórios de trabalho em segurança

git replace Criar referências temporárias que substituem objetos existentes, permitindo manipulação local de histórico sem destruição e para testes
git replace <old_commit> <new_commit>

Trocar temporariamente um commit por outro no repositório local, útil para testes ou patch de histórico sem reescrevê-lo

git replace --list

Mostrar todas as referências de substituição ativas

git replace -d <replace_ref>

Eliminar uma referência de substituição específica para reverter comportamento

git stash Guardar temporariamente alterações não commitadas numa pilha, permitindo mudar de contexto sem commit de trabalho inacabado
git stash push -p

Selecionar interativamente blocos de alterações para stash, dando controlo granular sobre o que é guardado

git stash push -m "WIP selective stash"

Criar um stash com uma mensagem personalizada para identificação mais fácil

git stash apply stash@{2}

Aplicar um stash específico da lista sem o remover

git rebase Reaplicar commits sobre outra base, facilitando histórico linear mais limpo e edição interativa de histórico
git rebase --interactive --autosquash

Iniciar sessão de rebase interativo que reordena e faz squash automático de commits marcados como fixup ou squash, limpando histórico

git rebase -i --autosquash HEAD~10

Reordenar e fazer squash automático de commits fixup/squash, limpando histórico antes de enviar

git commit --fixup <commit>

Criar um commit fixup que será autosquash durante rebase interativo

git commit --squash <commit>

Criar um commit squash para combinar com commit especificado no rebase

git bisect Ferramenta de pesquisa binária para identificar de forma eficiente o commit que introduziu um bug testando commits sucessivos e restringindo a alteração defeituosa
git bisect run

Automatizar o processo de bisect executando um script de teste em cada commit para identificar rapidamente o commit que introduziu o bug sem intervenção manual

git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh

Automatizar bisseção com script de teste em cada commit, acelerando bastante a identificação de bugs

git bisect visualize

Abrir ferramenta gráfica para visualizar o processo de bisseção

git bisect reset

Sair do modo bisect e voltar ao HEAD original

git commit Registar alterações no repositório com opções detalhadas para amend, sign, fixup e personalização de mensagens para manter histórico de alta qualidade
git commit --gpg-sign

Criar um commit assinado com a sua chave GPG para garantir verificação criptográfica da autenticidade e autoria do commit

git commit -S -m "Signed commit"

Assinar criptograficamente commits com a sua chave GPG, garantindo integridade e verificação de autoria

git config --global user.signingkey <key_id>

Configurar globalmente a chave GPG usada para assinar commits

git log --show-signature

Verificar e mostrar informação da assinatura GPG de commits

git reflog Manter log de atualizações ao HEAD e branches, essencial para recuperar commits perdidos e compreender movimentos locais de histórico
git reset --hard HEAD@{3}

Repor a branch atual para estado anterior a partir do reflog para recuperar ou desfazer alterações

git reflog expire --expire=now --all

Expirar imediatamente todas as entradas de reflog, limpando histórico (usar com cautela)

🧰 Dicas de Workflow Profissional e Automação

Tópico

Comandos / Exemplo

Explicação & Dicas Pro

Limpeza Agressiva do Repositório

git gc --aggressive --prune=now

Executa garbage collection profunda e remove objetos inacessíveis imediatamente para otimização. Usar em janelas de manutenção

Worktrees em Paralelo

git worktree add ../feature-branch feature

Manter múltiplos diretórios de trabalho para desenvolvimento simultâneo de funcionalidades, evitando overhead de clones

Histórico Linear Limpo

git rebase -i --autosquash

Antes de enviar, fazer rebase interativo com autosquash para manter histórico limpo e legível

Commits Seguros

git commit -S

Assinar commits com GPG para aumentar confiança em repositórios partilhados, obrigatório em muitos ambientes empresariais

Bisseção Automatizada

git bisect run ./test-script.sh

Automatizar procura de bugs executando script de teste em cada commit candidato durante bisect

Cache de Resolução de Conflitos

git config --global rerere.enabled true

Ativar reutilização de resoluções de conflitos para acelerar resolução de conflitos repetidos em rebase ou merges

Aliases e Hooks Partilhados

Guardar aliases Git comuns e hooks de commit num repositório partilhado ou pipeline CI para impor standards de equipa e aumentar produtividade

Recursos Adicionais

🧠 Dica

Não tente memorizar tudo. Use --help, explore e pratique regularmente:

git help <command>
git status

🌐 Links Úteis

📘 Documentação Oficial do Git — manual detalhado para todos os comandos Git:
https://git-scm.com/docs

📙 Learn Git Branching — tutorial visual interativo para dominar conceitos de branching:
https://learngitbranching.js.org

📕 Livro Pro Git (gratuito, de Scott Chacon & Ben Straub):
https://git-scm.com/book

📗 Git Cheatsheet (referência concisa oficial):
https://education.github.com/git-cheat-sheet-education.pdf