Tenho alterações em um arquivo, mais um novo arquivo, e gostaria de usar o git stash para guardá-los enquanto eu alterno para outra tarefa. Mas o git stash, por si só, oculta apenas as alterações no arquivo existente; o novo arquivo permanece na minha árvore de trabalho, bagunçando meu trabalho futuro. Como esconder esse arquivo não rastreado?
1437
git stash show
não retorna nada e você pode ficar tentado a descartá-lo (como eu acabei de fazer enquanto continha um script útil que escrevi há alguns meses atrás) → como recuperar um estoque caiu )Respostas:
Para ocultar seu diretório de trabalho, incluindo arquivos não rastreados (especialmente aqueles que estão no .gitignore), provavelmente você deseja usar este cmd:
git stash --include-untracked
Mais detalhes:
Atualização 17 de maio de 2018:
Novas versões do git agora têm o
git stash --all
que oculta todos os arquivos, incluindo arquivos não rastreados e ignorados.git stash --include-untracked
não toca mais nos arquivos ignorados (testado no git 2.16.2).Resposta original abaixo:
Atenção, isso excluirá permanentemente seus arquivos se você tiver alguma entrada de diretório / * no seu arquivo gitignore.
A partir da versão 1.7.7, você pode usar
git stash --include-untracked
ougit stash save -u
ocultar arquivos não rastreados sem prepará-los.Adicione (
git add
) o arquivo e comece a rastreá-lo. Então esconda. Como todo o conteúdo do arquivo é novo, eles serão ocultados e você poderá manipulá-lo conforme necessário.fonte
git stash --include-untracked
antesgit stash --all
na sua resposta por dois motivos. Primeiro ele responde a pergunta do OP melhor agora em 2019 e segundo porque --all faz algo que a maioria dos usuários provavelmente não quer em um que remove todos os arquivos que são .gitignoredA partir do git 1.7.7,
git stash
aceita a--include-untracked
opção (ou mão curta-u
). Para incluir arquivos não rastreados no seu esconderijo, use um dos seguintes comandos:Atenção, isso excluirá permanentemente seus arquivos se você tiver alguma entrada de diretório / * no seu arquivo gitignore.
fonte
.gitignore
pareça com istoignoredDirectory
e não,ignoredDirectory/*
ele ainda exclui aqueles não rastreados. Mesmo arquivos não rastreados, não apenas diretórios.*.extension
entradas?git
1.8.3-u
(--include-untracked
) opção pode esconder e pop arquivos untracked bem, masgit stash show
não lista os arquivos untracked que estão no estoqueAdicione o arquivo ao índice:
Todo o conteúdo do índice, além de qualquer alteração não faseada nos arquivos existentes, todos entrarão no stash.
fonte
git add .
não estava levando isso em consideração, por algum motivoNo git bash, o armazenamento em cache de arquivos não rastreados é obtido usando o comando
ou
http://git-scm.com/docs/git-stash
O git stash remove todos os arquivos não acompanhados ou não acompanhados do seu espaço de trabalho. E você pode reverter o git stash usando os seguintes comandos
Isso colocará o arquivo de volta no espaço de trabalho local.
Minha experiência
Eu tive que fazer uma modificação no meu arquivo gitIgnore para evitar a movimentação dos arquivos .classpath e .project no repositório remoto. Não tenho permissão para mover este .gitIgnore modificado no repositório remoto a partir de agora.
Os arquivos .classpath e .project são importantes para o eclipse - que é o meu editor java.
Em primeiro lugar, adicionei seletivamente o restante dos arquivos e me comprometi com a preparação. No entanto, o envio final não pode ser executado, a menos que o arquivo .gitIgnore modificado seja exibido e os arquivos não rastreados viz. .project e .classpath não são escondidos.
eu usei
para ocultar o arquivo .gitIgnore modificado.
Para armazenar arquivos .classpath e .project, usei
e removeu os arquivos do meu espaço de trabalho. A ausência desses arquivos diminui minha capacidade de trabalhar em meu local de trabalho no eclipse. Continuei concluindo o procedimento para enviar os arquivos confirmados para o remoto. Feito isso com sucesso, usei
Isso colou os mesmos arquivos de volta no meu espaço de trabalho. Isso me devolveu minha capacidade de trabalhar no mesmo projeto no eclipse. Espero que isso elimine os equívocos.
fonte
~/.gitignore
.Como já foi dito em outros lugares, a resposta está
git add
no arquivo. por exemplo:No entanto, a questão também é levantada em outra resposta: E se você realmente não quiser adicionar o arquivo? Bem, até onde eu sei, você precisa. E o seguinte NÃO funcionará:
isso falhará, da seguinte maneira:
Então o que você pode fazer? Bem, você precisa realmente adicionar o arquivo, no entanto , pode efetivamente descompactá-lo posteriormente, com
git rm --cached
:E então você pode continuar trabalhando, no mesmo estado em que estava antes do
git add
(ou seja, com um arquivopath/to/untracked-file
não rastreado chamado ; além de outras alterações que você possa ter tido nos arquivos rastreados).Outra possibilidade para um fluxo de trabalho sobre isso seria algo como:
[Nota: Como mencionado em um comentário de @mancocapac, você pode adicionar
--exclude-standard
umgit ls-files
comando (assim,git ls-files -o --exclude-standard
).]... que também poderia ser facilmente roteirizado - até mesmo os aliases (apresentados na sintaxe zsh; ajustam conforme necessário) [também reduzi o nome do arquivo para que ele caiba na tela sem rolar nesta resposta; fique à vontade para substituir um nome de arquivo alternativo de sua escolha]:
Observe que o último pode ser melhor como um script ou função de shell, para permitir que os parâmetros sejam fornecidos
git stash
, caso você não queira ,pop
masapply
/ ou queira especificar um stash específico, em vez de apenas assumir o topo 1. Talvez este (em vez do segundo apelido acima) [espaço em branco tenha sido ajustado para caber sem rolagem; adicione novamente para maior legibilidade]:Nota : Neste formulário, você precisa fornecer um argumento de ação e o identificador se for fornecer um identificador de stash, por exemplo,
unstashall apply stash@{1}
ouunstashall pop stash@{1}
Qual, é claro, você colocaria no seu
.zshrc
ou equivalente para que exista a longo prazo.Espero que esta resposta seja útil para alguém, reunindo tudo em uma única resposta.
fonte
No git versão 2.8.1: o seguinte funciona para mim.
Para salvar arquivos modificados e não rastreados no stash sem um nome
Para salvar arquivos modificados e não rastreados no stash com um nome
Você pode usar pop ou aplicar mais tarde, como a seguir.
fonte
git stash show
não os mostrou. Quando tenteigit stash apply
, recebi "erro: não foi possível restaurar arquivos não rastreados do stash". No entanto, os arquivos foram listados novamente como não rastreados, mas as alterações nos arquivos rastreados não foram restauradas. Acho que esses arquivos podem ser restaurados individualmente, verificando-os fora do estoque, mas essa solução não era o que eu esperava.Consegui esconder apenas os arquivos não rastreados, fazendo:
O último exibe o estoque dos arquivos rastreados, deixando apenas os arquivos não rastreados.
fonte
git stash save -u
não apenas salvar osuntracked
arquivos, ele economiza tanto otracked
euntracked
. Acho que a primeira salva que você está fazendo não é necessária neste caso. Existe um bom diagrama em atlassian.com/git/tutorials/saving-changes/… #Se você deseja ocultar arquivos não rastreados, mas manter os arquivos indexados (aqueles que você está prestes a confirmar por exemplo), basta adicionar a opção
-k
(manter o índice) à opção-u
fonte
Você pode simplesmente fazê-lo com o comando abaixo
ou
Para obter mais informações sobre o git stash, visite este post (clique aqui)
fonte
vamos supor que o arquivo novo e não rastreado seja chamado: "views.json". se você deseja alterar a ramificação ocultando o estado do seu aplicativo, geralmente digito:
Então:
E seria escondido. Então eu posso mudar de ramo com
fonte
Existem várias respostas corretas aqui, mas eu queria salientar que para os novos diretórios inteiros,
'git add path'
vai NOT trabalho. Portanto, se você tiver um monte de novos arquivos no caminho não rastreado e faça o seguinte:isso ficará oculto com a seguinte mensagem:
e se o caminho não rastreado for o único caminho que você está escondendo, o "esconderijo temporário" será um esconderijo vazio. A maneira correta é adicionar o caminho inteiro, não apenas o nome do diretório (por exemplo, finalize o caminho com um '/'):
fonte
Eu pensei que isso poderia ser resolvido informando ao git que o arquivo existe, em vez de enviar todo o conteúdo para a área de teste e depois chamar
git stash
. Araqnid descreve como fazer o primeiro.ou
No entanto, o último não funciona:
fonte
meu favorito, pois também salva os arquivos que você adicionou e não os preparou.
fonte
Encontrei um problema semelhante ao usar o Sourcetree com arquivos recém-criados (eles também não seriam incluídos no stash).
Quando eu escolhi 'encenar tudo' pela primeira vez e, em seguida, escondi os componentes recém-adicionados onde foram rastreados e, portanto, incluídos no esconderijo.
fonte
Eu costumava ponderar e desejar o mesmo recurso. Mas com o tempo, notei que realmente não é necessário. Quando você esconde, não há problema em deixar os novos arquivos. Nada de "ruim" pode acontecer com eles (quando você verifica outra coisa, o git irá erro e não substituirá o arquivo não rastreado existente)
E, como geralmente o período entre o
git stash
e ogit stash pop
é bastante pequeno, você precisará do arquivo não rastreado rapidamente novamente. Então, eu diria que o inconveniente do arquivo aparecendogit status
enquanto você está trabalhando em outra coisa (entre ogit stash
e ogit stash pop
) é menor que o inconveniente causado pelo trabalho e a atenção necessária, caso contrário custaria tentar adicionar o arquivo não rastreado ao seu esconderijo.fonte