Operações Essenciais e Cenários Complexos no Git

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

Tags: Git version-control git-submodule git-bisect git-rebase

Publicado em 9-19 20:11