Forçar o git stash a substituir arquivos adicionados

223

Eu tenho alguns arquivos que não foram rastreados no git. Fiz algumas alterações e queria confirmá-las, mas percebi que tinha esquecido de verificar primeiro os arquivos não modificados. Então, eu escondi os arquivos e adicionei as versões não modificadas.

Então, quando aplico o stash ao repositório, encontro conflitos devido aos arquivos já terem sido adicionados.

Como posso aplicar o stash e forçar as versões no stash a serem usadas preferencialmente aos originais no repositório?

obrigado

Stefan
fonte
7
Solução feia até que alguém encontre uma melhor: remova os novos arquivos usando git rmantes de fazê-lo git stash apply.
tom
Isso não vai perder a história? O motivo para adicionar as versões não modificadas foi manter o histórico.
Stefan
1
Não, não vai perder a história. Se você remover um arquivo, adicione-o novamente com uma pequena modificação e, em seguida, confirme, gito tratará como apenas uma pequena modificação.
tom

Respostas:

365

Use em git checkoutvez de git stash apply:

$ git checkout stash -- .
$ git commit

Isso restaurará todos os arquivos no diretório atual para sua versão escondida.


Se houver alterações em outros arquivos no diretório de trabalho que devem ser mantidas, aqui está uma alternativa menos pesada:

$ git merge --squash --strategy-option=theirs stash

Se houver alterações no índice, ou a mesclagem tocar os arquivos com alterações locais, o git se recusará a mesclar. Arquivos individuais podem ser retirados do stash usando

$ git checkout stash -- <paths...>

ou interativamente com

$ git checkout -p stash
tom
fonte
Nada disso funcionou no meu caso de uso. Conclusões e minha solução está aqui stackoverflow.com/a/26685296/496046 - este deve resolver sua situação também, @AlexanderBird
tremby
2
git checkout stash -- .Esse comando literalmente não fez nada quando eu o executei.
Rotsiser Mho
3
O @RotsiserMho Git não é muito bom em fornecer mensagens de confirmação. Tem certeza de que não fez nada? Funcionou bem para mim.
Sinjai
5
Eu tive que executar git checkout stash -- .na pasta pai mais alta que continha minhas alterações, caso contrário, ela só aplicou alterações na pasta de onde executei o comando.
Leo
1
@ Leo: Isso mesmo, é porque .especifica o diretório atual (você pode substituí-lo por um caminho diferente em vez de alterar o diretório). Atualizei minha resposta para deixar isso mais claro.
tom
13

git stash show -p | git apply

e git stash dropse você quiser soltar os itens escondidos.

Hasan TBT
fonte
2
Nota: você deve estar na raiz do repositório para que isso funcione corretamente, caso contrário, você poderá obtê- lo .
Ruslan
@PengheGeng Como você pode ver, eu respondi cerca de um ano antes NetEmmanuel
Hasan TBT
@Ruslan Estou recebendo isso enquanto estou na raiz do meu repo 🤔
Leo
6

Para forçar, git stash popexecute este comando

git stash show -p | git apply && git stash drop
NetEmmanuel
fonte
1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Versão longa:

Você recebe esse erro devido às alterações não confirmadas que deseja substituir. Desfazer essas alterações com git checkout HEAD. Você pode desfazer alterações em um arquivo específico com git checkout HEAD path/to/file. Depois de remover a causa do conflito, você pode aplicar como de costume.

Usuário12547645
fonte