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?

markdorison
fonte
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.

Cascabel
fonte
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
Artur Barseghyan
fonte
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
Vencedor
fonte
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'
Dr Beco
fonte
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
Luca C.
fonte
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.

Seth Johnson
fonte
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.

Strahinja Kustudic
fonte
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
gil
fonte
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

Pablo Pazos
fonte
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
3

Eu costumo fazer:

git checkout .
git pull

Na pasta raiz do projeto.

Cassiano Franco
fonte
2

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

git fetch && git merge --ff-only origin/master
Petah
fonte