O Wiki de um repositório é armazenado como uma entidade Git separada (geralmente em <repo>.wiki.git). Por isso, um comando padrão de clone não trará o Wiki. Para obtê-lo, é necessário clonar explicitamente o repositório da wiki:
git clone https://github.com/usuario/projeto.wiki.git
Ignorando Alterações de Permissão de Arquivo
Para evitar que o Git rastreie mudanças de permissões (comum ao transitar entre sistemas de arquivos diferentes como Windows e Linux), desative o modo de arquivo:
git config core.filemode false
Aplicando .gitignore em Arquivos Já Rastreados
Se você adicionar novas regras ao .gitignore depois que os arquivos já foram commitados, o Git continuará rastreando-os. Para aplicar o filtro retroativamente, limpe o cache local e reindexe:
git rm -r --cached .
git add .
git commit -m "Aplicando novas regras do gitignore"
Salvando Progresso com Stash para Hotfixes
Imagine que você está no meio de uma feature e surge um bug crítico em produção. Você precisa alternar para o branch principle para criar um hotfix, mas não quer fazer um commit incompleto. Use o stash:
git add .
git stash push -m "Progresso da feature X"
# Para incluir arquivos não rastreados:
git stash push --include-untracked -m "Progresso completo"
Após criar o branch de correção e resolver o problema, volte ao seu branch original e restaure o trabalho:
git checkout feature-x
git stash pop
Buscando e Renomeando Brancehs
Para puxar um branch remoto específico para um branch local com nome diferente:
git fetch origin
git checkout -b branch-local origin/branch-remoto
Renomear um branch (local e remotamente):
# Renomear localmente
git branch -m nome-antigo nome-novo
# Remover o branch antigo do remoto
git push origin --delete nome-antigo
# Enviar o novo branch e configurar o rastreamento
git push -u origin nome-novo
Gerenciamento de Tags
Criando e enviando uma tag anotada:
git tag -a v2.1.0 -m "Lancamento da versao 2.1.0" abc1234
git push origin v2.1.0
Removendo tags:
# Localmente
git tag -d v2.1.0
# Remotamente
git push origin :refs/tags/v2.1.0
Criando branches a partir de tags ou commits específicos:
git checkout -b hotfix-legacy v1.0.0
git checkout -b experimento def5678
Reescrita de Histórico e Rebase Interativo
Para consolidar múltiplos commits recentes em um único:
git rebase -i HEAD~5
Revertendo Commits Já Enviados ao Remoto
Se você cometeu um erro grave e já fez push, pode resetar o estado local e forçar a atualização remota. Atenção: isso reescreve o histórico e falhará se o branch estiver protegido.
git reset --hard commit_anterior_correto
# Remova manualmente quaisquer arquivos não rastreados criados
git clean -fd
git push --force
Trabalhando com Submódulos
Adicionando um submódulo:
git submodule add https://github.com/org/biblioteca-compartilhada.git libs/core
Inicializando e atualizando submódulos após clonar o projeto pai:
git submodule update --init --recursive
Atualizando um submódulo para a versão mais recente do seu branch remoto:
cd libs/core
git checkout main
git pull origin main
cd ../..
git add libs/core
git commit -m "Atualizando submódulo core para a última versão"
Removendo um submódulo completamente:
git submodule deinit -f libs/core
rm -rf .git/modules/libs/core
git rm -f libs/core
git commit -m "Removendo submódulo core"
Migração de Repositórios
Para mover um repositório preservando todo o histórico e branches:
git clone --bare git@servidor-antigo.com:equipe/projeto.git
cd projeto.git
git push --mirror git@servidor-novo.com:equipe/projeto.git
Após a migração, atualize a URL remota no clone local:
git remote set-url origin git@servidor-novo.com:equipe/projeto.git
Localizando Regressões com Git Bisect
Quando um bug é introduzido em um período com muitos commits, o git bisect usa busca binária para encontrar o commit culpado.
# Iniciar o processo
git bisect start
# Marcar o estado atual como ruim (com bug)
git bisect bad
# Marcar um commit antigo conhecido como bom (sem bug)
git bisect good a1b2c3d4
# O Git alternará para o commit do meio. Teste o código.
# Se o bug estiver presente:
git bisect bad
# Se o bug não estiver presente:
git bisect good
# Repita até o Git indicar o primeiro commit ruim.
# Após identificar, visualize as diferenças:
git diff commit_bom^ commit_ruim
# Restaurar o branch para o estado original
git bisect reset