Como descartar confirmações locais no Git?


264

Eu estava trabalhando em algo e decidi que estava completamente ferrado ... depois de ter cometido um pouco disso. Então, tentei a seguinte sequência:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

Nesse momento, recebi a mensagem

Your branch is ahead of 'origin/master' by 2 commits.

Quero descartar minhas confirmações locais , sem precisar apagar meu diretório local e baixar novamente tudo. Como posso conseguir isso?


6
Não é necessário fazer as duas coisas - git fetche git pullpull é uma combinação de busca e mesclagem.
— Éter

12
Nota para os usuários: o principal problema desta pergunta não tem nada a ver com a mensagem "Sua ramificação está à frente de 'origem / mestre' por N confirma." . Pare de fechar outras perguntas como duplicadas desta, devido a essa mensagem.

Respostas:


582
git reset --hard origin/master

removerá todas as confirmações fora de origin/masteronde originestá o nome do repositório e masteré o nome da ramificação.


1
Eu pensei que a sintaxe "origem / mestre", com uma barra, se referia a um repositório local?
— Daniel C. Sobral

9
mipadi: Mais corretamente, ele redefinirá o ramo atual para apontar para o mesmo commit que origem / mestre.
— Christoffer Hammarström

Refere-se a um ramo. origin/masteré um ramo que rastreia o masterramo do originrepositório remoto.
— Mipadi # 7/10

@ DanielC.Sobral Não, origin/masteré uma referência ao masterramo do controle remoto chamado origin.
— Matthew

1
O @littletiger git não rastreia pastas, apenas arquivos e seus caminhos. Portanto, ele ignorará completamente as pastas vazias (pastas sem arquivos ou apenas arquivos ignorados). Eles não aparecem em lugar algum, pois não há nada para eles.
— Mumbleskates

33

Como um aparte, além da resposta de mipadi (que deve funcionar a propósito), você deve saber o seguinte:

git branch -D master
git checkout master

também faz exatamente o que você deseja sem having to redownload everything(sua citação parafraseada). Isso ocorre porque seu repositório local contém uma cópia do repositório remoto (e essa cópia não é a mesma que o diretório local, nem mesmo a sua filial com check-out).

A eliminação de uma ramificação é perfeitamente segura e a reconstrução dessa ramificação é muito rápida e não envolve tráfego de rede. Lembre-se, o git é basicamente um repositório local por design. Até filiais remotas têm uma cópia no local. Há apenas alguns metadados que informam ao git que uma cópia local específica é na verdade uma ramificação remota. No git, todos os arquivos estão no seu disco rígido o tempo todo.

Se você não possui nenhum ramo que não seja o mestre, você deve:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Mas como isso diferencia os compromissos feitos localmente dos compromissos feitos na origem? Na verdade, isso me diz queCannot delete the branch 'master' which you are currently on.
— Daniel C. Sobral

1. Basicamente, todas as confirmações são iguais, independentemente de serem feitas localmente ou na origem. O importante é que os históricos sejam sincronizados corretamente. Seu commit local só existirá na origem depois que você os pressionou e, por padrão, o git recusará o push se o histórico na origem puder terminar em um estado que não faz sentido.
— Slebetman 7/10/10

2
2. É claro que você não pode excluir o ramo que está atualmente com check-out. Para excluir o mestre, verifique primeiro outro ramo. De se não há outro ramo simplesmente criar um temporário:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
— slebetman

Observe também o que eu disse sobre a sua cópia local do repositório remoto ser diferente: o git não permitirá que você edite ou mesmo visualize arquivos na sua cópia da filial remota. Isso permitirá que você crie outra ramificação a partir da ramificação remota, que você poderá visualizar e editar. Por convenção, essa ramificação local tem o mesmo nome que a ramificação remota. Você está parcialmente certo em origin/mastersua máquina local. Essa é a sua cópia local (completa) da filial remota. O ramo remoto real é origin master.
— Slebetman 7/10/10

Isso funcionou para mim. Talvez o git branch -D masternão fosse necessário, pois, como apontado, gera um erro.
— Alexis Wilke

15

O que faço é tentar redefinir o disco com HEAD. Isso eliminará todos os commits locais:

git reset --hard HEAD^

Esta é a melhor resposta, que realmente funcionou. Descartou todas as confirmações locais e redefiniu para HEAD. Qual é o uso de ^ char?
— karim

@karim o '^' é provavelmente o material regex, o que provavelmente algo muito profundo que eu não sei ou ler há muito tempo no arquivo do manual .. homem pena :)
— Giang Nguyen

1
Tarde, mas ^representa o commit pai, portanto, redefinir para HEAD^descartar alterações não confirmadas e mover o branch para o commit anterior, "efetivamente" excluindo "o commit mais recente (embora o commit ainda exista, o branch simplesmente não aponta para ele). A resposta terá apenas uma confirmação local e o restante são alterações não confirmadas. @karim @giang
— QuantumQuaver

3

Você precisa correr

git fetch

Para obter todas as alterações e, em seguida, você não receberá uma mensagem com "sua filial está à frente".


5
A busca não tem nada a ver com o principal problema do solicitante, que é se livrar das confirmações locais.

1
e se eu já tiver confirmado arquivos no local e tentar disparar o comando mencionado. Ele mostrará a mesma mensagem de erro. Eu tentei o git fetch e o git fetch -p também. mas mostrando o mesmo erro
— Morez

1

Vi casos em que o controle remoto ficou fora de sincronia e precisava ser atualizado. Se um reset --hardou um branch -Dnão funcionar, tente

git pull origin
git reset --hard 

isso não responder à pergunta, uma reset --hardobra nesta situação
— charlesb

1
Olá Charles, você está certo que reset --harddeve funcionar aqui. No entanto, estou simplesmente apontando que ocasionalmente falha ao redefinir a ramificação corretamente e a git pull originsincroniza novamente o controle remoto e permite reset --hardque funcione corretamente.
— perfil completo de Jim Clouse

0

Eu tive que fazer um:

git checkout -b master

como o git disse que não existe, porque foi limpo com o

git -D master
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.