Como resolvo o git dizendo "Confirme suas alterações ou as oculte antes que você possa mesclar"?

763

Fiz algumas atualizações na minha máquina local, enviei-as para um repositório remoto e agora estou tentando fazer as alterações no servidor e recebo a mensagem;

erro: suas alterações locais nos seguintes arquivos seriam substituídas por mesclagem:

wp-content / w3tc-config / master.php

Confirme suas alterações ou esconda-as antes de mesclar.

Então eu corri,

git checkout -- wp-content/w3tc-config/master.php

e tentei novamente e recebo a mesma mensagem. Estou assumindo que w3tcmudou alguma coisa no arquivo de configuração no servidor. Não me importo se a cópia local ou remota vai para o servidor (suponho que a remota seja a melhor), só quero mesclar o restante das minhas alterações (atualizações de plug-ins).

Alguma ideia?

Jo Sprague
fonte
11
Esta é uma pergunta mais explícita, com mais detalhes e uma resposta melhor. Eu acho que é valioso manter este por perto. Sim, o outro foi tecnicamente questionado primeiro, mas a remoção deste tornaria mais difícil para as pessoas encontrarem as respostas que procuravam.
117817 Jo

Respostas:

1301

Você não pode mesclar com modificações locais. O Git protege você de perder alterações potencialmente importantes.

Você tem três opções:

  • Confirme a alteração usando

    git commit -m "My message"
    
  • Esconda-o.

    O armazenamento em cache atua como uma pilha, onde você pode enviar as alterações e colocá-las na ordem inversa.

    Para esconder, digite

    git stash
    

    Faça a mesclagem e, em seguida, puxe o esconderijo:

    git stash pop
    
  • Descartar as alterações locais

    usando git reset --hard
    ougit checkout -t -f remote/branch

    Ou: descartar alterações locais para um arquivo específico

    usando git checkout filename

stdcall
fonte
104
Você pode alterações locais também rejeitam para um arquivo específico fazendo: git checkout filename
ckb
6
Obrigado. Gostaria de acrescentar a isso, se você fizer isso git reset --hardvocê também pode querer apagar arquivos untracked comgit clean -dfx
Jo Sprague
13
Por padrão git stash, não esconde arquivos para os quais não há histórico. Portanto, se você tiver arquivos que ainda não foram adicionados, mas que seriam substituídos ou "criados" pela mesclagem, a mesclagem ainda será bloqueada. Nessa situação, você também pode usar git stash -upara esconder arquivos não confirmados. Ou você pode simplesmente excluí-los!
joeytwiddle
25
correr git clean -dfxera uma péssima ideia. Foram removidos alguns arquivos .gitignored que eu realmente precisava.
ezuk
5
Eu encontrei uma situação em que um usuário, depois de fazer git reset --hard, ainda tinha alterações imersas!
Amedee Van Gasse
83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

O primeiro comando armazena suas alterações temporariamente no stash e as remove do diretório de trabalho.

O segundo comando alterna ramificações.

O terceiro comando restaura as alterações que você armazenou no stash (a --indexopção é útil para garantir que os arquivos temporários ainda estejam preparados).

Loganathan
fonte
1
stackoverflow.com/questions/15286075/… , também pode ser útil
vikramvi
2
para explicar o argumento de @ vikramvi: também podemos usar em git stash popvez de git stash apply. O primeiro remove-o do esconderijo enquanto o último ainda o mantém lá
Anupam 25/02
27

Você pode tentar um dos seguintes métodos:

rebase

Para alterações simples, tente rebaixá-lo enquanto puxa as alterações, por exemplo

git pull origin master -r

Portanto, ele aplicará sua ramificação atual em cima da ramificação upstream após a busca.

Isto é equivalente a: checkout master, fetche rebase origin/mastercomandos do git.

Este é um modo de operação potencialmente perigoso. Ele reescreve o histórico, o que não é um bom presságio quando você já o publicou. Não use esta opção, a menos que tenha lido com git-rebase(1)atenção.


Verificação de saída

Se você não se importa com as alterações locais, pode mudar para outro ramo temporariamente (com força) e alterá-lo novamente, por exemplo

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

Redefinir

Se você não se importa com as alterações locais, tente redefini-lo para HEAD (estado original), por exemplo,

git reset HEAD --hard

Se o exemplo acima não ajudar, pode haver regras no seu arquivo de normalização do git ( .gitattributes), então é melhor confirmar o que diz. Ou o seu sistema de arquivos não suporta permissões, então você deve desativar filemodena sua configuração do git.

Relacionado: Como forço o "git pull" para substituir arquivos locais?

kenorb
fonte
1
Não funciona: recebo a mesma mensagem como "oculte suas alterações primeiro". Quando digito "git stash" e, em seguida, "git pull" -> "erro: você tem alterações não salvas. Faça uma ocultação primeiro". Curto antes de destruir o meu computador
trinity420
@ trinity420 Poderia ser suas permissões de arquivo, verifique git statusquais alterações você tem depois de guardar. Se nenhuma resposta ajudar, considere adicionar uma nova pergunta.
kenorb
obrigado, mas o meu problema resolvido, tentou de tudo aqui, nada funcionou, em seguida, clicar em "confirmar as alterações" "Merge" em PHPStorm e então eu mudanças unstashed e funcionou ..
trinity420
14

Tente isto

git stash save ""

e tente puxar novamente

senhor ninguém
fonte
No meu caso, eu preciso usar git stash -u, como comentado em stackoverflow.com/questions/15745045/…
Fruit
13

Portanto, a situação em que me deparei foi a seguinte:

erro: Suas alterações locais nos seguintes arquivos seriam substituídas por mesclagem: wp-content / w3tc-config / master.php Por favor, confirme suas alterações ou as esconda antes de poder mesclar.

exceto que, antes disso, era remoto: então, na verdade, isso:

remote: error: Suas alterações locais nos seguintes arquivos seriam substituídas por mesclagem: some / file.ext Por favor, confirme suas alterações ou as esconda antes de poder mesclar.

O que estava acontecendo era (acho que não 100% positivo) que o gancho de recebimento de mensagens do git estava começando a rodar e estragar tudo devido a alterações de movimento no repositório do servidor remoto, o que, em teoria, não deveria ter sido tocado.

Então, o que acabei fazendo ao rastrear o gancho pós-recebimento e descobrir isso foi ter que ir ao repositório remoto no servidor e houve a alteração (que não estava no meu repositório local, que, de fato, disse que correspondia, não havia alterações, nada a confirmar, atualizado etc.) Assim, enquanto local, não houve alterações, no servidor, eu fiz um git checkout -- some/file.exte então os repositórios locais e remotos realmente correspondiam e eu podia continue trabalhando e implante. Não tenho muita certeza de como essa situação ocorreu, embora algumas dúzias de desenvolvedores e mudanças de TI possam ter algo a ver com isso.

Mike
fonte
2
É uma pergunta ou resposta?
Stdcall
2
@stdcall - Um pouco dos dois. Quando me deparei com essa situação, conforme descrito na pergunta, era isso que eu precisava fazer para corrigi-la. Definitivamente, não era uma solução normal para o git e, a partir da pergunta, parece que poderia ser a mesma situação anormal (ou seja, alterações de configuração no servidor, mas o local não possui alterações). Se alguém tiver mais uma idéia de por que (ou como) isso aconteceu, eu gostaria de receber qualquer insight.
Mike
7

AVISO: Isso excluirá arquivos não rastreados, portanto, não é uma ótima resposta para esta pergunta.

No meu caso, eu não queria manter os arquivos, então isso funcionou para mim:

Git 2.11 e mais recente:

git clean  -d  -fx .

Git mais antigo:

git clean  -d  -fx ""

Referência: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x significa que arquivos ignorados também são removidos e arquivos desconhecidos pelo git.

  • -d significa remover diretórios não rastreados, além de arquivos não rastreados.

  • -f é necessário para forçá-lo a executar.

Matéria escura
fonte
4

Para manter o registro dos seus arquivos recém-criados enquanto resolve esse problema:

Se você tiver criado arquivos recentemente , poderá criar um patch de alterações locais, obter mesclagens remotas e aplicar seu patch local após a conclusão da mesclagem remota, conforme definido passo a passo abaixo:

  1. Prepare suas alterações locais. (não confirmar). A preparação é necessária para criar o patch dos novos arquivos criados (como eles ainda não são rastreados)

git add .

  1. Crie um patch para manter o registro

git diff --cached > mypatch.patch

  1. Descartar alterações locais e excluir novos arquivos locais

git reset --hard

  1. Puxar alterações

git pull

  1. Aplique seu patch

git apply mypatch.patch

O Git mesclará alterações e criará arquivos .rej para alterações que não são mescladas.

Conforme sugerido por Anu, se você tiver problemas para aplicar o patch, tente:

git apply --reject --whitespace=fix mypatch.patch Esta resposta git: patch não aplica conversas em detalhes sobre esse problema

Aproveite o seu trabalho contínuo em seu recurso e confirme as alterações locais quando terminar.

Manpreet
fonte
Queria colocar uma parte do código com novas alterações, como fiz: 1. criei um patch do meu ramo de desenvolvimento local 2. fiz a redefinição forçada 3. puxei as novas alterações do master para o dev (para evitar conflitos de mesclagem) 4 fiz uma pequena alteração no meu dev 5. local empurrado para o dev 6. remendo aplicado -> Tenho erro error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply:, ainda tenho o mypatch.patch, mas não sei por que ele não está sendo aplicado e perdi minhas alterações !
Anu
Entendi, o comando correto foi git apply --reject --whitespace=fix mypatch.patch, recebi minhas alterações de volta ufa !!! [Graças a] ( stackoverflow.com/a/15375869/6484358 )
Anu
1
Anu, o comando git apply mypatch.patch está correto para aplicar o patch, é isso que eu uso o tempo todo, pode haver algum problema com o próprio patch criado e você nunca perde suas alterações se tiver o patch em mãos. contém todas as alterações consolidadas.
Manpreet
2

Solicitando confirmação antes da recepção

  • esconderijo
  • origem do git pull << branchname >>

Se necessário :

  • esconder git aplicar
Rahul Mankar
fonte
1
Use git stash quando desejar gravar o estado atual do diretório ativo e do índice, mas deseje voltar para um diretório ativo. O comando salva suas modificações locais e reverte o diretório de trabalho para corresponder ao commit HEAD.
Pushpak Sharma
2

Para mim, só git reset --hardfuncionou.

O comprometimento não era uma opção, pois não havia nada a comprometer.

O esconderijo não era uma opção, porque não havia nada para esconder.

Parece que poderia ter sido de arquivos excluídos .git/info/excludee ter git update-index --assume-unchanged <file>editado alguns arquivos.

Leo
fonte
0

No meu caso, fiz backup e excluí o arquivo sobre o qual o Git estava reclamando, confirmei e finalmente pude verificar outra ramificação.

Substituí o arquivo, copiei de volta no conteúdo e continuei como se nada tivesse acontecido.

CodyBugstein
fonte
0

Tentei a primeira resposta: git stashcom a pontuação mais alta, mas a mensagem de erro ainda era exibida, e encontrei este artigo para confirmar as alterações em vez de ocultar 'Relutant Commit'

e a mensagem de erro desapareceu finalmente:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

então funcionou. espero que esta resposta ajude. :)

Sophie cai
fonte
0

Se você estiver usando Git Extensions , poderá encontrar suas alterações locais Working directoryconforme mostrado abaixo:

insira a descrição da imagem aqui

Se você não vir nenhuma alteração, provavelmente é porque você está em um submódulo errado. Portanto, verifique todos os itens com um ícone submarino, como mostrado abaixo:

insira a descrição da imagem aqui

Quando você encontrou alguma alteração não confirmada:

Selecione a linha com Working directory, navegar para Diff guia, clique direito em linhas com um lápis (ou +ou -ícone), escolha Redefinir para primeira cometer ou cometer ou esconderijo ou o que você quer fazer com ele.

Bizhan
fonte
0

Para mim, isso funcionou:

git reset --hard

e depois

git pull origin <*current branch>

depois disso

git checkout <*branch>

Chloe
fonte
0

Provavelmente

git --rebase --autostash

ajudaria

Eugen Konkov
fonte