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.