Como fazer o git pull sobrescrever arquivos locais?

Como sobrescrever arquivos locais no git pull ?

O script é o seguinte:

  • Membro da equipe modifica modelos para o site em que estamos trabalhando
  • Eles adicionam algumas imagens ao catálogo de imagens (mas esqueça de adicioná-las sob o controle do código-fonte)
  • Eles enviam imagens pelo correio, depois para mim
  • Adiciono imagens sob o controle do código-fonte e as coloco no GitHub junto com outras alterações.
  • Eles não podem receber atualizações do GitHub porque o Git não quer sobrescrever seus arquivos.

Este é o erro que recebo:

erro: arquivo de árvore de trabalho não rastreado 'public / images / icon.gif' será sobrescrito por mesclagem

Como fazer o Git sobrescrevê-los? Essa pessoa é um designer. Eu costumo resolver todos os conflitos manualmente, então a versão mais recente é instalada no servidor, que eles só precisam atualizar em seu computador.

5705
14 июля '09 в 17:58 2009-07-14 17:58 perguntou por Jakub Troszok em 17 de julho de 2009 às 17:58 2009-07-14 17:58
@ 39 respostas
  • 1
  • 2

Importante: se você tiver alguma alteração local, ela será perdida. Com a opção --hard ou sem o --hard todas as confirmações locais que não foram transmitidas serão perdidas. [*]

Se você tiver arquivos que não são rastreados pelo Git (por exemplo, conteúdo de usuário baixado), esses arquivos não serão afetados.


Eu acho que este é o caminho certo:

 git fetch --all 

Então você tem duas opções:

 git reset --hard origin/master 

OU Se você estiver em outro ramo:

 git reset --hard origin/<branch_name> 

Explicação:

git fetch download dos dados mais recentes de um computador remoto, sem tentar mesclar ou mover nada.

Então git reset redefine o ramo principal para o que você acabou de receber. A opção --hard altera todos os arquivos em sua árvore de trabalho de acordo com os arquivos em origin/master


Manter commits locais atuais

[*] : Vale a pena observar que você pode salvar as confirmações locais atuais criando uma ramificação do master para redefinir:

 git checkout master git branch new-branch-to-save-current-commits git fetch --all git reset --hard origin/master 

Depois disso, todos os commits antigos serão armazenados em new-branch-to-save-current-commits .

Alterações pendentes

No entanto, alterações não corrigidas (mesmo em fases) serão perdidas. Certifique-se de ocultar e transmitir tudo o que você precisa. Para fazer isso, você pode executar o seguinte:

 git stash 

Em seguida, reaplique essas alterações não confirmadas:

 git stash pop 
7980
17 янв. a resposta é dada RNA 17 jan. 2012-01-17 03:02 '12 em 3:02 2012-01-17 03:02

Tente o seguinte:

 git reset --hard HEAD git pull 
border=0

Ele deve fazer o que quiser.

798
09 мая '10 в 22:45 2010-05-09 22:45 respondido a Travis Reeder May 09, '10 em 10:45 PM 2010-05-09 22:45

ATENÇÃO: o git clean remove todos os seus arquivos / diretórios não rastreáveis ​​e não pode ser desfeito.


Às vezes apenas clean -f não ajuda. Se você não possui diretórios rastreados, a opção -d também é necessária:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

ATENÇÃO: o git clean remove todos os seus arquivos / diretórios não rastreáveis ​​e não pode ser desfeito.

Tente -n usar -n ( --dry-run ). Isso mostrará o que será removido sem realmente excluir nada:

 git clean -n -f -d 

Exemplo de saída:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 a resposta é dada por David Avsajanishvili 19 de março de 2011 às 12:10 2011-03-19 12:10

Como o Hedgehog, acho que as respostas são terríveis. Mas, embora a resposta de Hedgehog possa ser melhor, não acho que seja tão elegante quanto pode ser. A maneira que eu encontrei isso é usar "amostragem" e "fusão" com uma estratégia específica. Isso deve garantir que as alterações locais sejam salvas até que sejam um dos arquivos que você está tentando sobrescrever.

Primeiro, confirme as alterações.

  git add * git commit -a -m "local file server commit message" 

Em seguida, recupere as alterações e reescreva se houver um conflito.

  git fetch origin master git merge -s recursive -X theirs origin/master 

"- X" é o nome da opção e "deles" é o valor dessa opção. Você prefere usar "suas" alterações em vez de "suas" alterações se houver um conflito.

347
11 апр. Resposta dada por Richard Kersey 11 de abril 2012-04-11 23:13 '12 às 11:13 PM 2012-04-11 23:13

Em vez disso:

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

Eu aconselharia a fazer o seguinte:

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

Não precisa levar todos os consoles e agências, se você for redefinir para a origem / filial mestre à direita?

248
26 апр. Johanneke postou em 26 de abr 2013-04-26 16:48 '13 às 16:48 2013-04-26 16:48

Parece que a melhor coisa a fazer é esta:

 git clean 

Para remover todos os arquivos não utilizados e continuar com o git pull normal ...

125
14 июля '09 в 18:16 2009-07-14 18:16 a resposta é dada por Jakub Troszok em 14 de julho de 2009 às 18:16 2009-07-14 18:16

Atenção, isso excluirá permanentemente seus arquivos se você tiver alguma entrada de diretório / * em seu arquivo gitignore.

Algumas respostas parecem terríveis. Terrível no sentido do que aconteceu com @Lauri, seguindo a sugestão de David Avsadjanishvili.

Em vez disso (git> v1.7.6):

 git stash --include-untracked git pull 

Mais tarde, você pode limpar o cache do histórico.

Manualmente, um por um:

 $ git stash list stash@{0}: WIP on <branch>: ... stash@{1}: WIP on <branch>: ... $ git stash drop stash@{0} $ git stash drop stash@{1} 

Cruel, tudo de uma vez:

 $ git stash clear 

Claro, se você quiser voltar ao que você escondeu:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. A resposta é dada por Hedgehog em 12 de fevereiro 2012-02-12 02:00 '12 às 2:00 2012-02-12 02:00

Você pode achar este comando útil para excluir alterações locais:

 git checkout <your-branch> -f 

E, em seguida, faça a limpeza (exclui os arquivos brutos da árvore de trabalho):

 git clean -f 

Se você deseja excluir diretórios desnecessários além dos arquivos sem rastreio:

 git clean -fd 
88
05 авг. a resposta é dada por Vishal 05 ago. 2010-08-05 21:06 '10 às 21:06 2010-08-05 21:06

Em vez de mesclar com git pull tente isto:

git fetch --all

seguido por:

git reset --hard origin/master .

81
22 нояб. A resposta é dada por Lloyd Moore em 22 de novembro. 2012-11-22 13:56 '12 em 1:56 pm 2012-11-22 13:56

A única coisa que funcionou para mim foi:

 git reset --hard HEAD~5 

Isso lhe dará cinco commits e depois

 git pull 

Eu encontrei isso olhando como cancelar git merge .

54
06 мая '11 в 0:53 2011-05-06 00:53 a resposta é dada por Chris BIllante em 06 de maio '11 às 0:53 2011-05-06 00:53

O problema com todas essas soluções é que elas são muito complexas ou um problema ainda mais sério é que elas excluem todos os arquivos brutos do servidor da Web, o que não queremos, porque os arquivos de configuração que estão sempre no servidor são sempre necessários e não no repositório git.

Aqui está a solução mais limpa que usamos:

51
06 нояб. Resposta dada por Strahinja Kustudic Nov. 06 2012-11-06 02:32 '12 em 2:32 2012-11-06 02:32

Eu tenho o mesmo problema. Ninguém me deu essa solução, mas funcionou para mim.

Eu decidi isso:

  1. Exclua todos os arquivos. Deixe apenas o diretório .git .
  2. git reset --hard HEAD
  3. git pull
  4. git push

Agora funciona.

38
13 янв. A resposta foi dada por John John Pichler em 13 de janeiro 2011-01-13 02:58 '11 às 2:58 2011-01-13 02:58

Primeiro de tudo, tente o caminho padrão:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Atenção : os comandos acima podem levar à perda de dados / arquivos, somente se eles não forem corrigidos! Se você não tiver certeza, primeiro faça backup de toda a sua pasta de repositório.

Então puxe-o novamente.

Se o acima não ajudar e você não precisar de seus diretórios / arquivos não acompanhados (basta fazer um backup primeiro, apenas para garantir), tente as seguintes etapas simples:

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Isto irá remover todos os arquivos git (exceto para .git/ dir, onde você tem todos os commits) e extraí-lo novamente.


Por que o git reset HEAD --hard pode não funcionar em alguns casos?

  1. Regras de usuário no .gitattributes file

    A presença da regra eol eol=lf em .gitattributes pode fazer com que o git altere algumas das alterações do arquivo, convertendo os finais das linhas CRLF para LF em alguns arquivos de texto.

    Em caso afirmativo, você deve cometer essas alterações CRLF / LF (exibindo-as no git status ) ou tente: git config core.autcrlf false para ignorá-las temporariamente.

  2. Incompatibilidade do sistema de arquivos

    Quando você usa um sistema de arquivos que não suporta atributos de permissão. Por exemplo, você tem dois repositórios, um para Linux / Mac ( ext3 / hfs+ ) e outro para sistemas de arquivos baseados em FAT32 / NTFS.

    Como você percebeu, existem dois tipos diferentes de sistemas de arquivos, então um que não suporta permissões Unix basicamente não pode redefinir permissões para arquivos em um sistema que não suporta tais permissões, então não importa o quanto você tente, git sempre detecta algumas "alterações".

33
26 окт. a resposta é dada em 26 de outubro . 2012-10-26 12:17 '12 às 12:17 2012-10-26 12:17

Bônus:

Falando em pull / fetch / merge nas respostas anteriores, gostaria de compartilhar um truque interessante e produtivo:

git pull --rebase

Essa equipe é a equipe mais útil da minha vida no Git, que economizou muito tempo.

Antes de enviar seu novo commit para o servidor, tente este comando e ele sincronizará automaticamente as mudanças mais recentes do servidor (com fetch + merge) e colocará seu commit no topo do log do Git. Não precisa se preocupar com a extração / fusão manual.

Encontre partes em O que faz "git pull --rebase"? ,

31
23 дек. A resposta é dada por Sazzad Hissain Khan em 23 de dezembro. 2015-12-23 18:41 '15 às 18:41 2015-12-23 18:41

Eu resumi as outras respostas. Você pode executar git pull sem erros:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Aviso Esse script é muito poderoso, então você pode perder suas alterações.

27
07 авг. a resposta é dada por Robert Moon 07 ago. 2015-08-07 06:03 '15 at 6:03 2015-08-07 06:03

Eu tive um problema semelhante. Eu tive que fazer isso:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. A resposta é dada por Ryan Jan 14 2011-01-14 18:18 '11 às 18:18 2011-01-14 18:18

Com base em minhas próprias experiências desse tipo, a solução oferecida por Strahinja Kustudic acima é de longe a melhor. Como outros notaram, a simples execução de uma redefinição física removerá todos os arquivos não testados, o que pode incluir muitas coisas que você não deseja excluir, como arquivos de configuração. Com mais segurança, você só precisa excluir os arquivos que precisam ser adicionados e, provavelmente, também deseja verificar se há arquivos modificados localmente que precisem ser atualizados.

É por isso que atualizei o script Kustudic para fazer exatamente isso. Eu também consertei um erro de digitação (ausente do original).

26
27 февр. Resposta dada por Rolf Kaiser em 27 de fevereiro 2013-02-27 17:43 '13 às 17:43 2013-02-27 17:43

Acredito que há duas possíveis causas do conflito que precisam ser resolvidas separadamente e, até onde posso dizer, nenhuma das respostas acima está relacionada a ambas:

  • Arquivos locais que não são monitorados devem ser removidos manualmente (mais seguros) ou, como sugerido em outras respostas, git clean -f -d

  • As confirmações locais que não estão na ramificação remota também devem ser excluídas. O IMO é a maneira mais fácil de fazer isso: git reset --hard origin/master (substitua o "master" por qualquer ramificação em que você está trabalhando e execute primeiro a git fetch origin )

23
12 дек. A resposta é dada a 12 de dezembro. 2011-12-12 22:54 '11 às 10:54 pm 2011-12-12 22:54

Uma maneira mais fácil:

 git checkout --theirs /path/to/file.extension git pull origin master 

Isto irá sobrescrever o seu arquivo git local.

20
05 мая '15 в 11:03 2015-05-05 11:03 a resposta é dada maximus 69 05 May '15 at 11:03 2015-05-05 11:03

Parece que a maioria das respostas aqui está focada no ramo master ; No entanto, às vezes, há casos em que trabalho no mesmo ramo de funções em dois lugares diferentes, e quero que um deles reflita um deles no outro, sem muitos saltos através de aros.

Com base na combinação da resposta de RNA e na resposta a uma pergunta semelhante , criei um excelente trabalho:

 git fetch git reset --hard @{u} 

Execute-o a partir do ramo, e ele só irá redefinir sua filial local para a versão upstream.

Isto pode ser convenientemente colocado no git forcepull do git ( git forcepull ):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Ou no arquivo .gitconfig :

 [alias] forcepull = "!git fetch ; git reset --hard @{u}" 

Aproveite!

19
25 февр. a resposta é dada por JacobEvelyn em 25 de fevereiro 2014-02-25 20:19 '14 às 20:19 2014-02-25 20:19

Eu tive o mesmo problema e, por algum motivo, mesmo o git clean -f -d não faria isso. É por isso que: Por algum motivo, se seu arquivo é ignorado pelo Git (através da entrada .gitignore, eu acho), ele ainda se preocupa em sobrescrevê-lo e então desconectá-lo, mas a rede não o excluirá, a menos que você adicione -x .

19
03 авг. Responder Tierlieb 03 ago. 2011-08-03 12:23 '11 às 12:23 2011-08-03 12:23

Eu apenas decidi por mim mesmo:

18
03 дек. resposta dada por Simon B. 03 dez. 2010-12-03 18:00 '10 às 18:00 2010-12-03 18:00

Eu tenho uma situação estranha que nem git clean nem git reset work. Eu tenho que remover o arquivo conflitante do git index usando o seguinte script para cada arquivo não rastreado:

 git rm [file] 

Então eu posso puxar muito bem.

17
19 сент. Resposta dada por Chen Zhang em 19 set 2011-09-19 17:18 '11 às 17:18 2011-09-19 17:18

Eu conheço um método muito mais simples e menos doloroso:

 $ git branch -m [branch_to_force_pull] tmp $ git fetch $ git checkout [branch_to_force_pull] $ git branch -D tmp 

É!

16
05 сент. a resposta é dada ddmytrenko 05 set . 2015-09-05 21:23 '15 às 21:23 2015-09-05 21:23

Essas quatro equipes trabalham para mim.

 git reset --hard HEAD git checkout origin/master git branch -D master git checkout -b master 

Para verificar / retirar depois de executar esses comandos

 git pull origin master 

Eu tentei muito, mas finalmente consegui sucesso nessas equipes.

13
20 марта '14 в 7:24 2014-03-20 07:24 a resposta é dada por vishesh chandra 20 de março de '14 at 7:24 2014-03-20 07:24

Apesar da pergunta original, as principais respostas podem causar problemas para pessoas que têm um problema semelhante, mas não querem perder seus arquivos locais. Por exemplo, veja Comentários por Al-Punk e crizCraig.

A próxima versão corrige suas alterações locais na ramificação de tempo ( tmp ), verifica a ramificação de origem (que, suponho, é a master ) e mescla as atualizações. Você pode fazer isso com stash , mas eu achei mais fácil usar apenas a abordagem branch / merge.

 git checkout -b tmp git add *; git commit -am "my temporary files" git checkout master git fetch origin master git merge -s recursive -X theirs origin master 

onde assumimos que outro repositório é o origin master .

12
22 окт. A resposta é dada por Snowcrash em 22 de outubro. 2014-10-22 20:31 '14 às 20:31 2014-10-22 20:31

Apenas faça

 git fetch origin branchname git checkout -f origin/branchname // This will overwrite ONLY new included files git checkout branchname git merge origin/branchname 

Dessa forma, você evita todos os efeitos colaterais indesejados, como excluir arquivos ou diretórios que deseja manter, etc.

12
19 окт. Resposta dada por user2696128 19 de out 2015-10-19 12:54 '15 às 12:54 2015-10-19 12:54

Redefinir ponteiro e cabeça para origin/master , mas não redefinir a árvore de trabalho:

 git reset origin/master 
11
15 февр. A resposta é dada por user811773 em 15 de fevereiro 2013-02-15 16:41 '13 às 4:41 pm 2013-02-15 16:41

Requisitos:

  • Acompanhe as alterações locais, para que ninguém as perca.
  • Torne o repositório local compatível com o repositório de origem remoto.

Solução:

  • Ocultar alterações locais.
  • Obtenha com arquivos limpos e ignorando .gitignore e hard reset para origem .

     git stash --include-untracked git fetch --all git clean -fdx git reset --hard origin/master 
9
02 сент. resposta dada vezenkov 02 Set 2015-09-02 02:00 '15 às 2:00 2015-09-02 02:00

Eu li todas as respostas, mas eu estava procurando por um comando para isso. Foi o que eu fiz Adicionado alias git para .gitconfig

 [alias] fp = "!f(){ git fetch ${1} ${2}  git reset --hard ${1}/${2};};f" 

Execute o comando

 git fp origin master 

é equivalente a

 git fetch origin master git reset --hard origin/master 
9
08 июля '16 в 16:11 2016-07-08 16:11 A resposta é dada por Venkat Kotra 08 julho '16 em 16:11 2016-07-08 16:11
  • 1
  • 2

Outras questões sobre tags ou fazer uma pergunta