Git Pull ao ignorar alterações locais?


489

Existe uma maneira de fazer um git pullque ignore qualquer alteração de arquivo local sem soprar o diretório e precisar executar um git clone?


17
Por "ignora", você quer dizer "substituir"?
— Cascabel

@Cascabel Significa reverter todas as alterações locais, descomprimir todas as confirmações locais, excluir todos os novos arquivos e diretórios locais, cancelar a exclusão de todos os arquivos e diretórios excluídos localmente, etc. Em resumo, basta executar um comando como se rm -rf local_repo && git clone remote_url.
— Victor

Respostas:


820

Se você quer que o pull substitua as alterações locais, faça a mesclagem como se a árvore de trabalho estivesse limpa, bem, limpe a árvore de trabalho:

git reset --hard
git pull

Se houver arquivos locais não rastreados, você poderá usá git clean-los para removê-los. Use git clean -fpara remover arquivos não rastreados, -dfpara remover arquivos e diretórios não -xdfrastreados e para remover arquivos ou diretórios não rastreados ou ignorados.

Se, por outro lado, você quiser manter as modificações locais de alguma forma, use o stash para escondê-las antes de puxá-las e depois reaplicá-las depois:

git stash
git pull
git stash pop

Não acho que faça sentido ignorar literalmente as alterações - metade da atração é mesclada e precisa mesclar as versões confirmadas do conteúdo com as versões buscadas.


4
Se depois que git resetseus arquivos ainda diferirem do controle remoto, leia stackoverflow.com/questions/1257592/…
— Coronel Panic

3
Git é a coisa mais estranha de todas. Git reset - feito. Em seguida, git status: seu ramo está à frente em 2 confirmações.
— Shailen

21
@shailenTJ "Alterações locais" aqui significa alterações não confirmadas, não confirmações locais. git reset --hardafeta o primeiro, não o último. Se você deseja redefinir completamente o estado do controle remoto, git reset --hard origin/<branch>- mas com frequência e nesse caso, esses dois commits pelos quais você está à frente da origem são um trabalho que você fez, não algo que você deseja jogar fora.
— Cascabel

2
Portanto, isso é o mesmo que destruir o repositório local e fazer o download novamente, certo? Eu só quero poder forçar e sobrescrever alterações por conveniência. 99% das vezes recebo essa mensagem de erro quando acidentalmente errei algo localmente e só quero começar do repositório.
— Sudo

E se você não puder ter uma mudança local versus cabeça? Por exemplo, o repositório foi feito em um sistema de arquivos que diferencia maiúsculas de minúsculas e é clonado em um sistema de arquivos que não diferencia maiúsculas de minúsculas e existem 2 arquivos com o mesmo nome em maiúsculas e minúsculas?
— xster

305

Para mim, o seguinte funcionou:

(1) Primeiro busque todas as alterações:

$ git fetch --all

(2) Reinicie o mestre:

$ git reset --hard origin/master

(3) Puxar / atualizar:

$ git pull

22
Funcionou muito bem para mim quando tive muitos problemas com a resposta principal. Obrigado!
— 0x0

6
Isso funciona mesmo quando u ter cometido ur mudanças locais, mas ainda u quiser reverter
— agsachin

16
Esta deve ser a resposta top :)
— Purus

5
@Marco Servetto: Você primeiro busca todas as suas alterações no Git, mas ainda não as aplica. Em seguida, você redefine o mestre para o último estado (atualizado). Se você pular a primeira etapa, reverterá as alterações para o antigo mestre (local). Pela minha experiência, da maneira como a descrevi, nunca causa problemas. Todas as outras tentativas fazem no final.
— Artur Barseghyan

1
Isso funcionou para mim, eu queria ignorar todas as minhas alterações locais, incluindo a recuperar arquivos apagados
— Neri

28

Você só quer um comando que dê exatamente o mesmo resultado que rm -rf local_repo && git clone remote_url, certo? Eu também quero esse recurso. Eu me pergunto por que o git não fornece esse comando (como git recloneou git sync), nem o svn fornece esse comando (como svn recheckoutou svn sync).

Tente o seguinte comando:

git reset --hard origin/master
git clean -fxd
git pull

Isso é o que realmente funciona, mesmo quando você já possui confirmações locais que deseja remover.
— Yuri Ghensev 11/0518

5
Atenção pessoal !! git clean -fxdremove arquivos de .gitignoretambém.
— Ramesh Navi

@RameshNavi Sure. É exatamente isso que se quer. O que se deseja é ter uma maneira mais rápida de cloná-lo novamente, ou seja, excluir todo o repositório local e cloná-lo.
— Victor

27

O comando abaixo não funcionará sempre . Se você fizer exatamente:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

e assim por diante...

Para realmente começar de novo, baixando a ramificação e substituindo todas as alterações locais, basta:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Isso vai funcionar muito bem.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'

4
SIM. Era disso que eu precisava para uma abordagem final "não dê um F sobre o que é local". Obrigado. :)
— Adambean

10
git fetch --all && git reset --hard origin/master

8

Veja o git stash para colocar todas as alterações locais em um "arquivo stash" e reverter para a última confirmação. Nesse ponto, você pode aplicar suas alterações ocultas ou descartá-las.


8

Se você estiver no Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

O loop for excluirá todos os arquivos rastreados que são alterados no repositório local, portanto git pull, funcionará sem problemas.
O mais legal é que apenas os arquivos rastreados serão substituídos pelos arquivos no repositório, todos os outros arquivos permanecerão intocados.


Eu acho que você quis dizer "arquivos rastreados", que é exatamente o que eu preciso, obrigado.
— Ali

qualquer equivalente para Powershell?
— Earlee 6/06/19

8

A maneira mais curta de fazer isso é:

git pull --rebase --autostash

não sabia --autostashantes, obrigado!
— shiro

7

isso funcionou para mim

git fetch --all
git reset --hard origin/master
git pull origin master

com a resposta aceita, recebo erros de conflito


Isso é muito semelhante à resposta de Artur Barseghyan de 2015 ... mas eu ainda gostaria de saber qual é o objetivo do terceiro comando: os arquivos de trabalho foram alterados após o segundo comando e o terceiro comando diz "Já atualizado "
— mike roedor

essa é a única combinação que funcionou no meu ambiente, talvez você esteja vendo uma coisa diferente, para mim, eu precisava dos três comandos
— Pablo Pazos

Interessante. Pode ser uma coisa de versão. Estou no git 2.7.4. Mas também acabei de ver um novo comentário de Artur Barseghyan: "Caso contrário, você poderá trabalhar em um mestre acidentalmente desatualizado".
— mike rodent

talvez, mas a única coisa que posso dizer é "isso funcionou para mim quando nenhuma outra solução funcionou", para que possa ajudar os outros.
— Pablo Pazos


2

Isso buscará a ramificação atual e tentará avançar rapidamente para dominar:

git fetch && git merge --ff-only origin/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.