Os seguintes arquivos da árvore de trabalho não rastreados seriam substituídos por mesclagem, mas não me importo

343

No meu ramo, eu tinha alguns arquivos em .gitignore

Em um ramo diferente, esses arquivos não são.

Quero mesclar o ramo diferente ao meu e não me importo se esses arquivos não são mais ignorados ou não.

Infelizmente eu recebo isso:

Os seguintes arquivos da árvore de trabalho não rastreados seriam substituídos por mesclagem

Como eu modificaria meu comando pull para substituir esses arquivos, sem que eu tivesse que encontrar, mover ou excluir esses arquivos eu mesmo?

CQM
fonte
11
Possível duplicata dos seguintes arquivos da árvore de trabalho não
rastreados
11
Esta é a melhor resposta, pois ela removerá apenas os arquivos que o
impedem

Respostas:

537

O problema é que você não está rastreando os arquivos localmente, mas arquivos idênticos são rastreados remotamente; portanto, para "puxar" o sistema seria forçado a substituir os arquivos locais que não são controlados por versão.

Tente correr

git add * 
git stash
git pull

Isso rastreará todos os arquivos, removerá todas as alterações locais nesses arquivos e obterá os arquivos do servidor.

userFog
fonte
59
git add -A .; git stashtrabalhou para mim. A git add *variante reclamou de caminhos ignorados.
imsky
11
Eu tentei git add., Git stash, git pull. Funcionou, mas ainda não entendi por quê?
ARK
11
Para mim, eu tinha um arquivo remoto que foi rastreado e um arquivo com o mesmo nome no repositório local que não foi rastreado. Portanto, se você adicionar o arquivo local, oculte as alterações e, em seguida, puxe, o arquivo remoto deve substituir o arquivo local.
userFog
2
Aqui está um bom link para entender como isso funciona, se alguém estiver interessado. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay
2
//, isso realmente não vai muito longe no objetivo desse erro.
Nathan Basanese
137

Você pode tentar o comando para limpar os arquivos não rastreados do local

Git 2.11 e versões mais recentes:

git clean  -d  -f .

Versões anteriores do Git:

git clean  -d  -f ""

Onde -dpode ser substituído pelo seguinte:

  • -x arquivos ignorados também são removidos e arquivos desconhecidos para o Git.

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

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

Aqui está o link que pode ser útil também.

sKhan
fonte
23
Eu acrescentaria -ipara o modo interativo. Além de excluir o diretório indesejado, também excluí minhas configurações de usuário para o projeto :-(
dumbledad
6
Vale a pena escanear os comentários para obter uma resposta semelhante, pois -xpode doer.
dumbledad 12/02/16
10
Mas isso é uma tarefa muito perigosa e não desfazível !! você pode perder muitos arquivos! SEJA CUIDADOSO!!
Mohamed Kawsara
16
Isso excluiu todo o meu diretório de fornecedores no Slim Framework . SER MUITO carreful com este comando
RousseauAlexandre
2
Você deve remover o 'x' da sua resposta. É muito perigoso!
earl3s
106

Os únicos comandos que funcionaram para mim foram:

git fetch --all
git reset --hard origin/{{your branch name}}
Asaf Manassen
fonte
5
Observe que essa resposta é necessária se você removeu os submódulos e os leu como bibliotecas no repositório original. Eu precisava de uma resposta e foi tudo o que funcionou.
Routhinator 12/09/16
Eu não tinha submódulos e tentei git clean e git stash, conforme sugerido nas outras respostas, mas somente isso ajudou.
kslstn
Depois de limpar uma variedade de submódulos, essas foram as únicas coisas que funcionaram para mim também. De nota especial, também tive um problema de distinção entre maiúsculas e minúsculas em um arquivo. Ex. XML.php para Xml.php na minha pasta de fornecedores do compositor.
KazaJhodo
11
Também funcionou para mim. Você pode explicar o que está acontecendo? Eu não entendo.
Dimitris Karamanis
11
Isso excluiu dois dos meus commits locais, tome cuidado antes de usar isso!
David Cian
27

Uma substituição para git mergeisso substituirá arquivos não rastreados

Os comentários abaixo usam 'FOI' para os 'arquivos de interesse', os arquivos que

  • existe no ramo doador,
  • não existem no ramo receptor,
  • e estão bloqueando a mesclagem porque eles estão presentes e não são rastreados no seu diretório de trabalho.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Uma substituição para git pullisso substituirá arquivos não rastreados

pull = fetch + merge, git fetchseguimos o git checkout -f, git checkout, git mergetruque acima.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Explicação detalhada

git merge -fnão existe, mas existe git checkout -f.

Usaremos git checkout -f+ git checkoutpara remover os arquivos de interesse (veja acima) e, em seguida, sua mesclagem poderá prosseguir normalmente.

Etapa 1. Esta etapa substitui forçosamente o FOI não rastreado pelas versões rastreadas do ramo doador (também faz check-out do ramo doador e atualiza o restante do diretório de trabalho).

git checkout -f donor-branch

Etapa 2. Esta etapa remove os FOI porque eles são rastreados em nossa filial atual (doadora) e ausentes na receiving-branchopção para a qual alternamos.

git checkout receiving-branch

Etapa 3. Agora que o FOI está ausente, a mesclagem no ramo doador não substituirá nenhum arquivo não rastreado, para que não ocorram erros.

git merge donor-branch
Esteis
fonte
3
Isso é muito limpo para ser a 7ª ou 8ª resposta!
Majed DH 01/04
11
Obrigado, @MajedDH, você fez o meu dia! <3
Esteis 14/04
11
Este aqui foi o instafix que eu estava procurando! Obrigado
AFM-Horizon
Prazer em ter ajudado você, @ AFM-Horizon!
Esteis
20

Remova todos os arquivos não rastreados:

git clean  -d  -fx .
Abhishek Goel
fonte
8
a exclusão de arquivos possivelmente usados em um projeto é não deve ser a solução real
Erdinç corbacI
4
caramba, limpou arquivos IDE também :(
kisna 15/01
18

Se for uma operação única, você poderá remover todos os arquivos não rastreados do diretório de trabalho antes de executar o pull. Leia Como remover arquivos locais (não rastreados) da árvore de trabalho atual do Git? para obter informações sobre como remover todos os arquivos não rastreados.

Certifique-se de não remover acidentalmente o arquivo não rastreado que você ainda precisa;)

mnagel
fonte
15

Você pode tentar esse comando

git clean -df
Amr Mohammed
fonte
5
qual é a utilidade de excluir diretórios não rastreados? .. eles podem ser valiosos, você sabe.
zhekaus 18/08/16
Você poderia explicar o que faz?
Safak Ozkan
12

Atualização - uma versão melhor

Essa ferramenta ( https://github.com/mklepaczewski/git-clean-before-merge ):

  • excluir arquivos não rastreados idênticos aos seus git pullequivalentes,
  • reverter alterações nos arquivos modificados cuja versão modificada é idêntica aos seus git pullequivalentes,
  • relatar arquivos modificados / não rastreados que diferem de sua git pullversão,
  • a ferramenta tem a --pretendopção que não modifica nenhum arquivo.

Versão antiga

Como esta resposta difere de outras respostas?

O método apresentado aqui remove apenas os arquivos que seriam substituídos por mesclagem. Se você tiver outros arquivos não rastreados (possivelmente ignorados) no diretório, esse método não os removerá.

A solução

Esse trecho extrairá todos os arquivos não rastreados que serão substituídos git pulle os excluirá.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

e então faça:

git pull

Este não é um comando git porcelain, portanto verifique sempre o que ele faria com:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Explicação - porque os forros são assustadores:

Aqui está um resumo do que ele faz:

  1. git pull 2>&1- capture a git pullsaída e redirecione tudo para o stdout, para que possamos capturá-la facilmente com grep.
  2. grep -E '^\s- a intenção é capturar a lista dos arquivos não rastreados que seriam substituídos git pull. Os nomes de arquivos têm um monte de caracteres em branco na frente deles, então nós o usamos para obtê-los.
  3. cut -f2- - remova o espaço em branco do início de cada linha capturada em 2.
  4. xargs -I {} rm -rf "{}"- nós xargsiteramos sobre todos os arquivos, salve o nome em "{}" e chame rmcada um deles. Usamos -rfpara forçar a exclusão e a remoção de diretórios não rastreados.

Seria ótimo substituir as etapas de 1 a 3 pelo comando de porcelana, mas não conheço nenhum equivalente.

mate
fonte
Obrigado, muitas vezes tenho arquivos não rastreados no meu diretório de trabalho que não quero que sejam excluídos ou confirmados. No meu caso, eu precisava substituir git pullcomgit checkout <branch_name>
mihow 27/02/19
6

Se você considerar usar o -fsinalizador, poderá executá-lo primeiro como um teste a seco. Só que você sabe de antemão que tipo de situação interessante você vai acabar em seguida ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
Maarten
fonte
6

Além da resposta aceita, é claro que você pode remover os arquivos se eles não forem mais necessários, especificando o arquivo:

git clean -f '/path/to/file/'

Lembre-se de executá-lo com o sinalizador -n primeiro se desejar ver quais arquivos o git clean removerá. Observe que esses arquivos serão excluídos. No meu caso, eu não me importava com eles, então essa era uma solução melhor para mim.

MMM
fonte
5

Uma maneira de fazer isso é esconder as alterações locais e retirá-las do repositório remoto. Dessa forma, você não perderá seus arquivos locais, pois os arquivos irão para o esconderijo.

git add -A
git stash
git pull

Você pode verificar seus arquivos escondidos locais usando este comando - git stash list

AHM Forhadul Islam
fonte
3

Para quem não sabe, o git ignora as diferenças de nome em maiúsculas / minúsculas em arquivos e pastas. Isso acaba sendo um pesadelo quando você os renomeia para o mesmo nome com um caso diferente.

Encontrei esse problema ao renomear uma pasta de "Petstore" para "petstore" (maiúscula para minúscula). Eu editei meu arquivo .git / config para parar de ignorar maiúsculas e minúsculas, fiz alterações, reduzi meus commits e escondi minhas alterações para ir para um ramo diferente. Não pude aplicar minhas alterações ocultas neste outro ramo.

A correção que eu achei que funcionava era editar temporariamente meu arquivo .git / config para ignorar temporariamente o caso novamente. Isso causou git stash applysucesso. Então, mudei o ignoreCase de volta para false. Eu então adicionei tudo, exceto os novos arquivos na pasta petstore que o git estranhamente alegou que foram excluídos, por qualquer motivo. Confirmei minhas alterações e corri git reset --hard HEADpara me livrar desses novos arquivos não rastreados. Meu commit apareceu exatamente como o esperado: os arquivos na pasta foram renomeados.

Espero que isso ajude a evitar meu mesmo pesadelo.

A. Davidson
fonte
Não funcionou para mim. Eu apaguei todos os arquivos na pasta. Então git pull -fentão git checkout .. Que pesadelo.
precisa saber é o seguinte
Mesmo? Funcionou bem para mim apenas algumas semanas atrás. Você tentou editar seu arquivo gitconfig para iniciar / parar de ignorar o caso, conforme apropriado?
A. Davidson
Obrigado. Eu precisava mesclar do mestre depois de corrigir a caixa no caminho da pasta. Consegui mesclá-lo com o git ignore case, depois disso, apenas reativei a sensibilidade do case.
Rubenisme
3

Nem limpar / redefinir / check-out rígido / rebase funcionou para mim.

Acabei de remover os arquivos que o git se queixava *

rm /path/to/files/that/git/complained/about

* Verifiquei se esses arquivos podem ser removidos ao verificar um novo repositório em uma pasta separada (os arquivos não estavam lá)

Michał Szkudlarek
fonte
1

No meu caso, quando eu tive esse problema. Eu tinha um arquivo local que havia renomeado no controle remoto.

Ao tentar o git pullGit me disse que o novo nome do arquivo não foi rastreado - que estava no controle remoto, embora ainda não existisse no local.

Como não havia nenhuma instância localmente, não pude fazê-lo git pullaté git rmo nome do nome do arquivo antigo (o que não era óbvio a princípio por causa da minha idéia estúpida de renomeá-lo).

Tom Bush
fonte
0

Se você tiver os arquivos escritos em .gitignore, remova os arquivos e execute o git pull novamente. Isso me ajudou.

uko akanowo
fonte