Esconda apenas um arquivo

174

Eu gostaria de poder esconder apenas as alterações de um único arquivo:

git stash save -- just_my_file.txt

O acima não funciona embora. Alguma alternativa?

EoghanM
fonte
para arquivo único , em vez de manipular comandos stash, uma abordagem muito mais fácil é copiar um arquivo e quando você deseja trazê-lo de volta para simplesmente copiar o original. por exemplo. cp just_my_file.txt just_my_file.txt.manualstash agora você pode fazer todos os check-outs e outras coisas e, como a cópia é "arquivo não rastreado", é possível mover-se pelas ramificações e confirmar sem problemas. Quando você está no ramo direito / commit onde você quer "mesclar o único arquivo" apenas fazer mv just_my_file.txt.manualstash just_my_file.txte agora você pode rever as alterações e confirmá-lo quando necessário
Dimitry K

Respostas:

173

Acho que stash -pé provavelmente a escolha que você deseja, mas, caso encontre outras coisas ainda mais complicadas no futuro, lembre-se:

Stashé realmente apenas uma alternativa muito simples aos conjuntos apenas um pouco mais complexos branch. O Stash é muito útil para mover as coisas rapidamente, mas você pode realizar coisas mais complexas com ramificações sem muito mais dor de cabeça e trabalho.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

faça o que quiser e depois simplesmente rebasee / ou mergeo tmpbranch. Realmente não é que muito trabalho extra quando você precisa fazer monitoramento mais cuidadoso do estoque permitirá.

Wes Hardaker
fonte
2
No lado positivo, você pode transformar esconderijos em galhos reais sem grandes dores.
Wes Hardaker
87

Se você não deseja especificar uma mensagem com suas alterações ocultas, passe o nome do arquivo após um traço duplo.

$ git stash -- filename.ext

Se for um arquivo não rastreado / novo, você precisará prepará-lo primeiro.

No entanto, se você não deseja especificar uma mensagem, use push.

git stash push -m "describe changes to filename.ext" filename.ext

Ambos os métodos funcionam nas versões git 2.13+

sealocal
fonte
1
Esta resposta parece ser o mais para a frente para mim quando tomada alterar alterações: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey
1
Eu acho que isso deve contar com algumas funcionalidades muito novas. Não funciona no git 2.1.4.
Richard Smith
Isso resulta em um comportamento estranho para mim, com o stash sendo salvo, mas os mesmos arquivos sendo adicionados à preparação ao mesmo tempo (git v2.20.1),
paradroid
58

Você pode esconder interativamente linhas únicas com git stash -p(análogo a git add -p).

Não é necessário um nome de arquivo, mas você pode pular outros arquivos daté chegar ao arquivo que deseja esconder e que todas as alterações nele ocultam a.

Benjamin Bannier
fonte
3
Isso leva muito tempo se você tiver muitos arquivos que não deseja ocultar.
Jjj #
23
eu não sei quando isso mudou, mas como de git 2.14.1você pode especificar o nome do arquivogit stash -p <filename>
múon
21

A melhor opção é git stash save --keep-indexpreparar tudo, menos esse arquivo, e dizer ao stash para manter o índice , escondendo assim o arquivo não estático:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Como Dan aponta, thefiletostashé o único a ser redefinido pelo stash, mas também oculta os outros arquivos, portanto, não é exatamente o que você deseja.

CharlesB
fonte
2
Embora isso mantenha o índice no mesmo estado, isso também não esconde os arquivos que estão no índice? Em outras palavras, se depois de fazer isso você confirmar o índice para a ramificação atual, alterne para outra ramificação e faça git stash pop, não aplicará todos os arquivos, não apenas o que queremos esconder?
Dan Molding
@ DanMoulding: você está absolutamente certo, eu não pensei sobre isso.
precisa saber é o seguinte
16

Caso você realmente queira dizer 'descartar alterações' sempre que usar 'git stash' (e realmente não usar git stash para esconder temporariamente), nesse caso, você pode usar

git checkout -- <file>

Observe que o git stash é apenas uma alternativa mais rápida e simples para ramificar e fazer coisas.

Devesh
fonte
Eu acho que essa é a melhor resposta se você deseja remover todas as alterações modificadas em um único arquivo.
Mohamed Haseel 11/02
e eu gostaria de esta é a melhor resposta para essa tarefa em particular
Zakir Hussain
6
A pergunta era clara o suficiente e não perguntou como reverter as alterações em um arquivo. Votado.
Richard Smith
Esta é uma boa resposta, mostrando claramente como uma alternativa. Mas algumas pessoas será suficiente teimoso usar downvote como recurso de abusar: +1
Mukul Jain
@MukulJain Na verdade, eu precisava usar o stash por arquivo de maneira muito temporária (basicamente separando algumas alterações em dois commits que afetavam as mesmas linhas, para um arquivo). Na verdade, não vou votar, apenas declarar que é inútil para mim.
Paul Stelian