@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.
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?
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).
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
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'
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.
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.
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.
rm -rf local_repo && git clone remote_url
.Respostas:
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:
Se houver arquivos locais não rastreados, você poderá usá
git clean
-los para removê-los. Usegit clean -f
para remover arquivos não rastreados,-df
para remover arquivos e diretórios não-xdf
rastreados 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:
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.
fonte
git reset
seus arquivos ainda diferirem do controle remoto, leia stackoverflow.com/questions/1257592/…git reset --hard
afeta 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.Para mim, o seguinte funcionou:
(1) Primeiro busque todas as alterações:
(2) Reinicie o mestre:
(3) Puxar / atualizar:
fonte
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 (comogit reclone
ougit sync
), nem o svn fornece esse comando (comosvn recheckout
ousvn sync
).Tente o seguinte comando:
fonte
git clean -fxd
remove arquivos de.gitignore
também.O comando abaixo não funcionará sempre . Se você fizer exatamente:
e assim por diante...
Para realmente começar de novo, baixando a ramificação e substituindo todas as alterações locais, basta:
Isso vai funcionar muito bem.
fonte
fonte
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.
fonte
Se você estiver no Linux:
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.
fonte
A maneira mais curta de fazer isso é:
fonte
--autostash
antes, obrigado!isso funcionou para mim
com a resposta aceita, recebo erros de conflito
fonte
Eu costumo fazer:
Na pasta raiz do projeto.
fonte
Isso buscará a ramificação atual e tentará avançar rapidamente para dominar:
fonte
.gitignore
"Adicionar arquivos indesejados ao .gitignore funciona, desde que você não os tenha comprometido inicialmente com nenhuma ramificação."
Além disso, você pode executar:
https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html
fonte