🐙 Git e GitHub CLI
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 |
|
git grep -n "TODO" |
Encontrar linhas contendo |
|
git grep -i "login" |
Procurar a palavra |
|
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 |
|
git branch -d old-feature |
Apagar uma branch local chamada |
|
git checkout |
Mudar de branch ou restaurar ficheiros de outro commit | |
git checkout main |
Mudar para a branch |
|
git checkout -b new-branch |
Criar e mudar para uma nova branch chamada |
|
git switch |
Mudar de branch (alternativa simplificada ao checkout) |
|
git switch main |
Mudar para a branch |
|
git switch -c feature-x |
Criar e mudar para uma nova branch chamada |
|
git switch new-feature |
Mudar para uma branch existente chamada |
|
git merge |
Combinar alterações de outra branch na atual | |
git merge new-feature |
Fazer merge da branch |
|
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 |
|
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 |
📡 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 |
|
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 |
|
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 |
|
git fetch |
Descarregar alterações do remoto sem fazer merge | |
git fetch origin |
Buscar todas as atualizações do remoto |
|
git fetch origin main |
Buscar apenas a branch |
|
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 ( |
📦 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 |
|
git tag -d v1.0 |
Apagar a tag local |
|
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: |
|
git push origin :refs/tags/v1.0 |
Apagar a tag remota |
🛠️ 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 |
|
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 submodule sync --recursive |
Sincronizar URLs de submódulos após alterações em |
|
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 |
|
git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz |
Criar |
|
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
ghpermite 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 ( |
|
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 |
|
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 |
|
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 |
|
gh repo create |
Criar um novo repositório GitHub a partir da CLI | |
gh repo create my-project |
Criar um novo repositório chamado |
|
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 |
💡 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-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