Resetar branch local conforme branch do repositório

Neste artigo você vai aprender a como resetar branch local conforme branch do repositório, ou seja, resetar o branch de acordo com a master

Pra deixar o branch local exatamente igual ao do repositório remoto, são dois comandos:

git fetch origin
git reset --hard origin/main

Troque main por master se o branch principal do teu projeto ainda for esse

O fetch atualiza a referência origin/<branch> aqui no teu clone, e o reset –hard move a ponta do branch local pra ela, reescrevendo o índice e o diretório de trabalho

Se liga antes de apertar o enter: o –hard descarta qualquer alteração em arquivo rastreado feita desde aquele commit, e arquivos não rastreados continuam onde estão (pra esses existe o git clean)

Resetar branch local conforme branch do repositório capa

Fala programador(a), beleza? Bora aprender mais sobre branches e git!

Primeiramente vamos atualizar todos os arquivos que temos no local com os do repositório remoto, para isso podemos utilizar o git fetch

Por último basta utilizar o comando git reset

Em reset vamos colocar a flag –hard, para forçar a reinicialização do branch

E escolher o branch que vamos utilizar como parâmetro para o reset

Em repositórios mais antigos você vai utilizar origin/master

Porém com as mudanças mais recentes o nome deve ser origin/main

Isso sempre está diretamente ligado ao branch principal do seu projeto, vale a checagem

Formação Vibe Coding
Formação Recomendada

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Veja o comando na prática:

git fetch origin
git reset --hard origin/<branch>

Lembre-se de substituir <branch> por master ou main, depende do seu repositório

Quer aprender mais sobre git? Veja este curso gratuito:

Conclusão

Neste artigo vimos como resetar branch local conforme branch do repositório em git

Utilizamos o git fetch para assegurar o recebimento das últimas atualizações

Por fim o reset para resetar o branch local de acordo com um branch remoto, geralmente o master ou main

Confira nossos cursos gratuitos no Youtube, com vídeos todos os dias!

Se inscreva e ative o sininho para receber as notificações e aprender mais ainda sobre desenvolvimento web!

Veja também nosso catálogo de cursos na Udemy, todos com exercícios e projetos práticos, nas mais diversas tecnologias

O link acima contém um cupom de desconto para os cursos!

Como saber se é master ou main:

O chute aqui custa caro, então melhor perguntar pro próprio Git

git remote show origin

Esse comando mostra os detalhes do remoto, incluindo os dados dos branches de rastreamento

E por que essa confusão existe? Porque as duas pontas mudaram em ritmos diferentes

No GitHub, desde 1 de outubro de 2020, todo repositório novo nasce com o branch padrão main, e os que já existiam não foram mexidos

Já o Git, a ferramenta que roda na tua máquina, ainda cria o branch inicial como master, e a troca pra main está prevista pro Git 3.0

Da pra fixar isso de uma vez nos teus repositórios novos:

git config --global init.defaultBranch main

Essa configuração está disponível a partir do Git 2.28

No GitHub também tem o ajuste: nas preferências de usuário (github.com/settings/repositories) ou nas configurações da organização, na página de repository-defaults

E se tu quiser apontar explicitamente pra onde o HEAD do remoto olha:

git remote set-head origin master

Isso faz refs/remotes/origin/HEAD apontar pra refs/remotes/origin/master, e só funciona se o branch remoto já existir, senão precisa buscar antes

Uma variação que vale conhecer aqui:

git fetch --prune

O –prune remove as referências remote-tracking que não existem mais lá no remoto, antes de buscar as novas

Ou seja, aqueles origin/feature-antiga que ficam encalhados no teu clone saem do caminho

Dá pra deixar isso como padrão pela config fetch.prune, ou por remote.<nome>.prune se tu quiser só num remoto específico

O mesmo efeito de limpeza também sai com git remote prune origin

Cuidado: o –hard destrói trabalho de verdade

Antes de sair rodando, se liga no que essa flag faz

O git reset –hard <commit> move a ponta do branch atual e reescreve o índice E o diretório de trabalho

Qualquer alteração em arquivo rastreado feita desde aquele commit é descartada, sem perguntar nada

A própria documentação do Git é bem direta nisso: o –hard é a única flag que torna o reset perigoso, porque desfaz também o teu trabalho no diretório

É uma das poucas operações do Git que realmente destroem dado

Então a regra de ouro antes de resetar: commita, ou pelo menos tenha certeza de que o que está ali no working directory não te faz falta

Já me ferrei uma vez por causa disso 😅

E os arquivos que o reset NÃO apaga:

Tem uma pegadinha clássica aqui

O reset –hard não encosta nos arquivos não rastreados, aqueles que tu criou e nunca deu git add

Então você reseta o branch, acha que ficou igualzinho ao remoto, e continua com um monte de arquivo solto no projeto

Pra isso existe outro comando:

git clean -fd

O -d faz ele recursar nos diretórios não rastreados, e o -f é o que autoriza a deleção de fato

Sem o -f, o git clean se recusa a deletar arquivo ou diretório, a não ser que clean.requireForce esteja definido como false

E se tu quiser levar junto os arquivos ignorados pelo .gitignore, entra o -x

Tome cuidado com esse aqui, ele é irmão do rm -rf da vida

Deu ruim? Dá pra voltar atrás

Calma, nem todo reset –hard é sentença de morte

O Git guarda as posições anteriores do HEAD no reflog

git reflog
git reset --hard HEAD@{1}

O HEAD@{1} é a posição imediatamente anterior ao reset, ou seja, onde tu estava antes de fazer besteira

E se o reset veio logo depois de um pull ou de um merge, tem um atalho ainda mais direto

Operações de pull e merge sempre deixam a ponta anterior do branch em ORIG_HEAD:

git reset --hard ORIG_HEAD

Isso devolve índice, árvore de trabalho e ponta do branch pro estado anterior

Mas não vá dormir em cima: as entradas do reflog têm prazo de validade

O padrão do Git é gc.reflogExpire de 90 dias, e gc.reflogExpireUnreachable de 30 dias pros commits que ficaram inalcançáveis

E lembrando: isso salva COMMIT, não salva alteração que nunca foi commitada

Perguntas frequentes

O git reset –hard apaga meus arquivos?

Os arquivos rastreados, sim. O reset –hard reseta o índice e a árvore de trabalho, e qualquer alteração feita desde o commit alvo é descartada

A documentação do Git trata o –hard como a única flag que torna o reset perigoso, porque ela desfaz também o trabalho no diretório

Já os arquivos não rastreados ele não toca, esses continuam ali no projeto

Como apagar também os arquivos não rastreados depois do reset?

Com o git clean:

git clean -fd

O -d faz o comando recursar nos diretórios não rastreados, e o -x remove também os arquivos ignorados

O -f é obrigatório: sem ele, o git clean se recusa a deletar arquivos ou diretórios, a menos que clean.requireForce esteja definido como false

Dá pra desfazer um git reset –hard?

Na maioria dos casos dá, via reflog

git reflog
git reset --hard HEAD@{1}

O reflog lista as mudanças de posição do HEAD, e o HEAD@{1} é a posição imediatamente anterior ao reset

Se o reset veio logo depois de um pull ou merge, a ponta anterior do branch fica em ORIG_HEAD, então git reset –hard ORIG_HEAD devolve índice, árvore de trabalho e branch pro estado anterior

Só não conte com isso pra sempre: o padrão do Git é gc.reflogExpire de 90 dias e gc.reflogExpireUnreachable de 30 dias

É origin/master ou origin/main?

Depende do repositório, e a checagem é rápida:

git remote show origin

Esse comando mostra os dados dos branches de rastreamento do remoto

Contexto pra entender a bagunça: no GitHub, desde 1 de outubro de 2020, os repositórios recém-criados nascem com main, e os que já existiam não foram afetados

Já o Git em si ainda usa master como nome do branch inicial, com a mudança pra main prevista pro Git 3.0

Como definir main como branch padrão dos meus repositórios novos?

No Git, pela configuração init.defaultBranch:

git config --global init.defaultBranch main

Ela está disponível a partir do Git 2.28

No GitHub, o nome do branch padrão também pode ser configurado nas preferências de usuário (github.com/settings/repositories) ou nas configurações da organização, na página de repository-defaults

Meu origin/<branch> aponta pra um branch que não existe mais, como limpar?

Com o prune no fetch:

git fetch --prune

Ele remove as referências remote-tracking que não existem mais no repositório remoto, antes de buscar

O mesmo efeito sai com git remote prune origin

E pra virar padrão, tem as configs fetch.prune e remote.<nome>.prune

Leia também

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

Formações

Formação SAAS com IA

Formação SAAS com IA

Tire usas ideias do papel criando softwares com IA, integre pagamentos e lance seu projeto!

  • 291 aulas
  • 18 projetos
  • 24h 17min

Blog | Mais populares