Como ignoro um erro no 'git pull' sobre minhas alterações locais que serão substituídas por mesclagem?

569

Como ignoro a seguinte mensagem de erro no pull do Git?

Suas alterações locais nos arquivos a seguir seriam substituídas por mesclagem

E se eu quiser substituí-los?

Eu tentei coisas como git pull -f, mas nada funciona.

Para ser claro, só quero substituir alterações específicas, não tudo.

mae
fonte
Relacionados, mas não duplicado: stackoverflow.com/questions/52704/...
Daniel Hilgarth
7
@BrianKnoblauch concordo totalmente! Além disso, não é muito "mesclado" se for "sobrescrito", é? Eu sinto falta SVN todos os dias ...
user1944491
2
git config core.fileMode falsesalvar meus tempos
Nolwennig
E se eu não quiser substituí-los?
Philip Rego

Respostas:

439

Se você deseja remover todas as alterações locais - incluindo arquivos que não são rastreados pelo git - da sua cópia de trabalho, basta ocultá-las:

git stash push --include-untracked

Se você não precisar mais deles, agora poderá soltar esse esconderijo:

git stash drop

Se você não deseja ocultar as alterações que você já organizou - por exemplo, com git add-, adicione a opção --keep-index. Observe, no entanto, que isso ainda impedirá a mesclagem se essas alterações realizadas colidirem com as do upstream.


Se você deseja substituir apenas partes específicas de suas alterações locais, há duas possibilidades:

  1. Confirme tudo o que você não deseja substituir e use o método acima para o resto.

  2. Use git checkout path/to/file/to/revertpara as alterações que você deseja substituir. Verifique se o arquivo não está preparado por meio de git reset HEAD path/to/file/to/revert.

Daniel Hilgarth
fonte
Possibilidade # 2 não funciona. Depois de executar o comando, nada acontece. Ao puxar, ainda recebo o mesmo erro.
mae
1
@ user1132363: Funciona para mim. Teste-o primeiro com um único arquivo. Além disso, verifique se o arquivo que você deseja substituir não está preparado.
Daniel Hilgarth
3
O truque era usar git checkout HEAD^ path/to/file/to/revert. Usar HEAD ^ fez toda a diferença.
mae
2
@ user1132363: Isso verifica a versão anterior e não a que está atualmente registrada. Não acredito que essa seja a abordagem correta.
precisa saber é o seguinte
1
Eu tive que deixar de fora " save --keep-index".
Peter Mortensen
318

Tudo bem, com a ajuda das outras duas respostas, eu vim com uma solução direta:

git checkout HEAD^ file/to/overwrite
git pull
mae
fonte
7
Isso funcionou para mim. Você poderia expandir esta resposta, ie. o que isso está realmente fazendo?
AC Patrice
3
Ele está caindo alterações locais, revertendo à referência CABEÇA que é provavelmente o último commit no mestre ramo
K3A
32
por que HEAD ^ em vez de HEAD?
Yura
19
HEAD ^ é a abreviação de HEAD ^ 1, o que significa essencialmente a confirmação antes de HEAD. Você também pode executar HEAD ^ 2 pela confirmação antes dessa. Para obter mais informações, consulte git-scm.com/book/en/v2/… e stackoverflow.com/questions/1955985/… .
Davidneedham 06/07/2015
4
por favor, explique o que isso faz na resposta
endolith
242

Isso funciona para eu substituir todas as alterações locais e não requer uma identidade:

git reset --hard
git pull
kravits88
fonte
4
O SO precisa trabalhar em seu ranking, algo complicado para encontrar uma resposta funcional e altamente classificada até o momento.
Benedict K.
3
@BenedictK. Acredito que o sistema de classificação reflete adequadamente "o que a maioria das pessoas considera mais útil". Eles são classificados por votos. Mais pessoas preferem as outras soluções. Essa é uma boa solução, mas mais pessoas acham as outras respostas mais úteis.
Kittsil 30/03/19
Funciona muito bem para mim
Ender
super fácil =) thx ^^
lestat_kim
tanques, funciona bem para mim
Igor
76

Aqui está uma solução que descarta as alterações faseadas:

git reset file/to/overwrite
git checkout file/to/overwrite
Após o embate
fonte
11
Irritantemente, se a diferença percebida vier do fato de o arquivo ter suas novas linhas alteradas quando o check-out foi feito, isso não resolverá o problema.
DanielSank
1
Resolveu o meu problema.
Loïc N.
esta é a melhor resposta, imo, porque não perturbar qualquer itens encenado, mas aborda o problema do arquivo impedindo a puxar
theRiley
65

Você pode confirmar suas alterações antes de fazer a mesclagem ou armazená-las:

  1. git stash save
  2. git merge origin/master
  3. git stash pop
Suneel Kumar
fonte
10
O ponto é que você não deveria ter que fazer isso. Basta pegar o material HEAD atual e ..... fundi-lo! É muito simples, Git, todos os outros VCS fazem isso ... mas não. Linus tinha que ser irritante de usar.
Jon
@ Jon Esta solução é para o Ubuntu, não encontrei nada melhor que isso.
Suneel Kumar 19/09/16
Infelizmente a --autostashopção está disponível apenas com a --rebaseopção (
Eugen Konkov
isso vai introduzir tantos problemas que não vale a pena. Leva 5 minutos, pelo menos, para carregar também. Também apresenta erros "Desvincular arquivo". downvote
Philip Rego
51

Se você deseja descartar as alterações locais em um arquivo, faça o seguinte:

git checkout -- <file>

Em seguida, você pode sobrescrever o (s) arquivo (s) com a versão mais recente executando:

git pull
pabloasc
fonte
@ pabloasc Isso destrói suas alterações locais nesse arquivo.
Suneel Kumar 29/09/16
6
Sim, ele faz: "E se eu quiser substituí-los?"
David
1
A pergunta original não é capaz disso, esta resposta pode dar pesadelo a alguém que pode copiar cegamente e colar o comando.
Suneel Kumar
No caso de você encenou uma já cometeu, você primeiro tem que reverter a cometer via git reset HEAD~e, em seguida, fazer ogit checkout
dopexxx
git checkout -- <file>falha comerror: pathspec '<file>' did not match any file(s) known to git.
A__ 17/01/19
18

Se o seu repositório contiver alguns arquivos removidos de master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch
Nikhil KR
fonte
12

Às vezes, nada disso funciona. Irritantemente, devido à coisa de LF que penso, o que funcionará é excluir os arquivos e depois puxá - los. Não que eu recomende esta solução, mas se o arquivo não existir, o git não informará inutilmente que suas alterações (que podem até não ser alterações) serão substituídas e permitirão que você continue.

Use por sua conta e risco.

Jeremy Holovacs
fonte
Quando seu devido preso para fins de linha, este método é uma poupança de vida
Dan Pisarski
Isso não está funcionando para mim. Os arquivos não existem localmente e ainda estou recebendo o erro.
PRMan 7/04
11

git stash save --keep-index não funcionou para mim.

O comando abaixo funcionou como esperado.

git reset --hard
git pull

Ele substitui todas as alterações locais, se você não precisar delas.

Khemraj
fonte
10

Tantas respostas aqui que odeio acrescentar mais uma, mas todas as anteriores são mais desajeitadas do que precisam. Eu tenho que fazer isso o tempo todo, pois o Git parece confuso e diz que modifiquei os arquivos que não foram alterados (não podem ser revertidos porque não foram alterados, mas não é possível puxar porque supostamente foram alterados). O mais rápido que encontrei até agora é:

git stash
git stash drop
git pull
Brian Knoblauch
fonte
funcionou como um encanto
Blaze
Surpreendente! solução simples e funcional.
naïveRSA 9/04
brilhante, muito obrigado
Hamza
8

No Git recente, você pode adicionar -r/ --rebaseno pullcomando para rebase sua ramificação atual no topo da ramificação upstream após a busca. O aviso deve desaparecer, mas existe o risco de você ter alguns conflitos que precisará resolver.


Como alternativa, você pode fazer o checkout de um ramo diferente com força e voltar masternovamente, por exemplo:

git checkout origin/master -f
git checkout master -f

Em seguida, puxe-o novamente como de costume:

git pull origin master

O uso desse método pode poupar tempo a partir de stash ( git stash) e possíveis problemas de permissão, redefinição de arquivos ( git reset HEAD --hard), remoção de arquivos ( git clean -fd), etc. Além disso, é fácil lembrar os itens acima.

kenorb
fonte
8

Esse problema ocorre porque você fez alterações localmente no (s) arquivo (s) e o mesmo arquivo (s) existe (s) com as alterações no repositório Git, portanto, antes de puxar / empurrar, você precisará ocultar as alterações locais:

Para substituir as alterações locais de um único arquivo:

git reset file/to/overwrite
git checkout file/to/overwrite

Para substituir todas as alterações locais (alterações em todos os arquivos):

git stash
git pull
git stash pop

Além disso, esse problema pode ser devido a você estar em uma ramificação que não é mesclada com a ramificação principal.

BSB
fonte
5

git reset --hard && git clean -df

Cuidado : Isso redefinirá e excluirá os arquivos não rastreados.

Yamen Ashraf
fonte
27
Não se usa machado para remover a mosca da testa do amigo.
HonoredMule
3
NÃO use isso sem a consciência de que alguns arquivos serão excluídos.
precisa
4

Você pode usar isso para substituir o arquivo

git checkout file_to_overwrite
Deepika Patel
fonte
4

A melhor maneira de resolver esse problema é:

git checkout -- <path/file_name>

Depois disso, você pode sobrescrever o arquivo:

git pull origin master
AHM Forhadul Islam
fonte
Eu tive o problema mencionado porque atualizei o índice para assumir que os arquivos não foram alterados. Ainda não me deixou fazer o puxão. Eu usei git checkout -- path/*apenas uma vez, e isso me permitiu executar o pull depois.
Stephen O'Flynn
4

Isso funcionou para eu descartar as alterações no servidor remoto ativo e extrair do GitHub de controle de origem:

git reset --hard
git pull origin master
Gajen Sunthara
fonte
4

Aqui está a minha estratégia para resolver o problema.

Declaração do Problema

Precisamos fazer alterações em mais de 10 arquivos. Tentamos PULL (git pull origin master), mas Git gritou:

erro: suas alterações locais nos seguintes arquivos seriam substituídas por mesclagem: confirme ou armazene as alterações antes de poder mesclar.

Tentamos executar commite depois pull, mas eles também não funcionaram.

Solução

Na verdade, estávamos no estágio sujo , porque os arquivos estavam na "Área de preparação", também conhecida como "Área de índice", e alguns estavam na "Área principal", também conhecida como "diretório local do Git". E queríamos extrair as alterações do servidor.

Verifique este link para obter informações sobre diferentes estágios do Git de maneira clara: Estágios do GIT

Seguimos os seguintes passos

  • git stash (isso tornou nosso diretório de trabalho limpo. Suas alterações são armazenadas na pilha pelo Git).
  • git pull origin master (Puxe as alterações do servidor)
  • git stash apply (Aplicadas todas as alterações da pilha)
  • git commit -m 'message' (Confirmou as alterações)
  • git push origin master (Enviou as alterações para o servidor)
  • git stash drop (Largue a pilha)

Vamos entender quando e por que você precisa esconder

Se você estiver no estado sujo , significa que está fazendo alterações em seus arquivos e, por qualquer motivo, é obrigado a puxar ou alternar para outra ramificação para algum trabalho muito urgente; portanto, neste momento, não é possível puxar ou alterne até confirmar sua alteração. O stashcomando está aqui como uma mão amiga.

Do livro ProGIT , 2ª Edição:

Freqüentemente, quando você trabalha em parte de seu projeto, as coisas estão em um estado confuso e você deseja alternar entre ramificações um pouco para trabalhar em outra coisa. O problema é que você não deseja confirmar o trabalho pela metade apenas para voltar a esse ponto mais tarde. A resposta para esse problema é o comando git stash. O armazenamento em cache leva o estado sujo do seu diretório de trabalho - ou seja, os arquivos rastreados modificados e as alterações faseadas - e o salva em uma pilha de alterações inacabadas que você pode aplicar novamente a qualquer momento.

STK
fonte
3

Se você deseja sobrescrever alterações específicas, precisa de uma maneira de dizer quais você deseja esquecer.

Você pode tentar ocultar seletivamente as alterações que deseja abandonar git stash --patche, em seguida, descartá-las git stash drop. Você pode então puxar as alterações remotas e mesclá-las normalmente.

Will Vousden
fonte
3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Não sei por que isso ainda não foi respondido, mas a solução, como você pode ver, é simples. Todas as respostas aqui sugerem o mesmo: para excluir / salvar suas alterações locais e aplicar a montante, em seguida (se você save) aplicar as alterações locais na parte superior.

O que git pull --rebase --autostashfaz passo a passo:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Meu caso (provavelmente o seu também):

Tenho alterações locais (alterações no diretório de trabalho):

insira a descrição da imagem aqui

Quando tento fazer alterações remotas, recebo um erro:

insira a descrição da imagem aqui

Essas alterações não se cruzam com as alterações locais:

insira a descrição da imagem aqui

Então, quando pull --rebase --autostashalterações locais são salvas e aplicadas sem nenhum problema automaticamente

insira a descrição da imagem aqui

Agora minhas alterações locais são um pouco menores: insira a descrição da imagem aqui

Eugen Konkov
fonte
2

Eu tive um caso especial disso: eu tinha um arquivo com --assume-inalterado nele. Foi difícil localizar, pois o git statuscomando não mostrava nenhuma alteração


fonte
Eu tenho esse mesmo problema. Você encontrou uma maneira de contornar isso? Eu suponho que eu poderia remover e depois adicionar novamente assumir inalterado ... o que eu fiz foi apenas fazer check-out desses arquivos manualmente para obter versões inalteradas ... apenas imaginando se existe uma maneira de fazer com que o checkout / rebase / mesclagem substitua apenas eles.
David
1
Não, tive que abandonar a coisa toda "assumir inalterada".
2

Se você deseja manter as alterações de produção no servidor, basta mesclar com um novo item de configuração. O método de processamento é o seguinte:

git stash
git pull
git stash pop

Talvez você não execute todas as operações. Você pode saber o que pode fazer a seguir.

YanQing
fonte
Você pode então usar o git diff - w + nome do arquivo para confirmar a fusão de código automaticamente
Yanqing
1

Eu estava ignorando um arquivo no meu repositório e, quando o fiz git pull upstream master, recebi o seguinte erro:

erro: suas alterações locais nos seguintes arquivos seriam substituídas por mesclagem: myfile.js, confirme suas alterações ou oculte-as antes de mesclar. Interrompendo

Para resolvê-lo, fiz o seguinte

git update-index --no-assume-unchanged myfile.js

Então eu fiz git statuse recebi esta mensagem

No mestre da filial Sua filial está atrás de 'origem / mestre' em 4 confirmações e pode ser encaminhada rapidamente. (use "git pull" para atualizar sua filial local)

Alterações não preparadas para confirmação: (use "git add ..." para atualizar o que será confirmado) (use "git checkout - ..." para descartar as alterações no diretório de trabalho)

modificado: myfile.js

nenhuma alteração adicionada ao commit (use "git add" e / ou "git commit -a")

Então eu git checkout myfile.jssegui git pull upstream master. Dessa vez, a operação git pull foi bem-sucedida.

Dmitry
fonte
1

Eu encontrei isso ao puxar do mestre.

A maneira como eu lidei com isso, usando o Visual Studio;

  1. Primeiro, realizei a confirmação de desfazer na minha solução.
  2. Então eu fiz o processo de extração do Git.

Espero que isto ajude!

AJ Macapaz
fonte
1

A solução mais simples é:

git reset --hard && git pull
Jackkobec
fonte
1

Sou novo no git e não tenho certeza se minha solução é uma boa idéia.

Eu testei TODAS as respostas e nenhuma delas funcionou para mim!

Mas eu encontrei outra solução:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Espero que isto ajude.

Milad Safaei
fonte
1

O erro "Suas alterações locais nos arquivos a seguir seriam substituídos por mesclagem" ocorre porque você tem algumas alterações no repositório local que ainda não foram confirmadas, portanto, antes de sair do repositório remoto, apenas confirme as alterações no repositório local.

Digamos que seu repositório remoto remoto tenha alguma ramificação xyz e você deseja que essa ramificação de repositório remoto xyz seja mesclada (copiada para) na ramificação local de repositório xyz,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}
ASR
fonte
0

Se esse erro ocorrer devido a terminações de linha,

git add
git checkout mybranch

vai funcionar. Não sei ao certo por que isso funciona.

user60561
fonte
0

Para Pycharm, você pode executar Git -> Revert e, em seguida, puxar.

Munichong
fonte
0

Essa mensagem também pode acontecer se git-lfsfor usada e um ponteiro de arquivo foi substituído por um arquivo real.

então você usa:

git stash
git lfs migrate import
git pull

saída total do meu caso

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

consulte https://github.com/git-lfs/git-lfs/issues/2839

c33s
fonte
0

Eu tentei e com sucesso, antes de puxar, vamos confirmar todos os arquivos que você não confirmou, então você não receberá essas mensagens do AS.

Ta Quang Tu
fonte