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?
Respostas:
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
Isso rastreará todos os arquivos, removerá todas as alterações locais nesses arquivos e obterá os arquivos do servidor.
fonte
git add -A .; git stash
trabalhou para mim. Agit add *
variante reclamou de caminhos ignorados.Você pode tentar o comando para limpar os arquivos não rastreados do local
Git 2.11 e versões mais recentes:
Versões anteriores do Git:
Onde
-d
pode 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.
fonte
-i
para o modo interativo. Além de excluir o diretório indesejado, também excluí minhas configurações de usuário para o projeto :-(-x
pode doer.Os únicos comandos que funcionaram para mim foram:
fonte
Uma substituição para
git merge
isso substituirá arquivos não rastreadosOs comentários abaixo usam 'FOI' para os 'arquivos de interesse', os arquivos que
Uma substituição para
git pull
isso substituirá arquivos não rastreadospull = fetch + merge
,git fetch
seguimos ogit checkout -f, git checkout, git merge
truque acima.Explicação detalhada
git merge -f
não existe, mas existegit checkout -f
.Usaremos
git checkout -f
+git checkout
para 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).
Etapa 2. Esta etapa remove os FOI porque eles são rastreados em nossa filial atual (doadora) e ausentes na
receiving-branch
opção para a qual alternamos.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.
fonte
Remova todos os arquivos não rastreados:
fonte
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;)
fonte
Você pode tentar esse comando
fonte
Atualização - uma versão melhor
Essa ferramenta ( https://github.com/mklepaczewski/git-clean-before-merge ):
git pull
equivalentes,git pull
equivalentes,git pull
versão,--pretend
opçã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 pull
e os excluirá.e então faça:
Este não é um comando git porcelain, portanto verifique sempre o que ele faria com:
Explicação - porque os forros são assustadores:
Aqui está um resumo do que ele faz:
git pull 2>&1
- capture agit pull
saída e redirecione tudo para o stdout, para que possamos capturá-la facilmente comgrep
.grep -E '^\s
- a intenção é capturar a lista dos arquivos não rastreados que seriam substituídosgit 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.cut -f2-
- remova o espaço em branco do início de cada linha capturada em 2.xargs -I {} rm -rf "{}"
- nósxargs
iteramos sobre todos os arquivos, salve o nome em "{}" e chamerm
cada um deles. Usamos-rf
para 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.
fonte
git pull
comgit checkout <branch_name>
Se você considerar usar o
-f
sinalizador, 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 ;-Pfonte
Além da resposta aceita, é claro que você pode remover os arquivos se eles não forem mais necessários, especificando o arquivo:
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.
fonte
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.
Você pode verificar seus arquivos escondidos locais usando este comando -
git stash list
fonte
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 apply
sucesso. Então, mudei o ignoreCase de volta parafalse
. 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 corrigit reset --hard HEAD
para 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.
fonte
git pull -f
entãogit checkout .
. Que pesadelo.Nem limpar / redefinir / check-out rígido / rebase funcionou para mim.
Acabei de remover os arquivos que o git se queixava *
* Verifiquei se esses arquivos podem ser removidos ao verificar um novo repositório em uma pasta separada (os arquivos não estavam lá)
fonte
No meu caso, quando eu tive esse problema. Eu tinha um arquivo local que havia renomeado no controle remoto.
Ao tentar o
git pull
Git 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 pull
atégit rm
o 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).fonte
Se você tiver os arquivos escritos em .gitignore, remova os arquivos e execute o git pull novamente. Isso me ajudou.
fonte