Pergunta

Eu tenho alterações em um arquivo, além de um novo arquivo, e gostaria de usar git stash para guardá-los enquanto eu mudar para outra tarefa. Mas git stash por si só esconde apenas as alterações no arquivo existente; o novo arquivo permanece em minha árvore de trabalho, atravancando o meu futuro trabalho. Como posso guardar esse arquivo untracked?

Foi útil?

Solução

Atualização de 17 maio de 2018:

Novas versões do git agora têm git stash --all que esconde todos os arquivos, incluindo arquivos untracked e ignorados.
git stash --include-untracked há toques mais longos arquivos ignorados (testados em git 2.16.2).

resposta original abaixo:

Atenção, fazendo isso irá excluir permanentemente seus arquivos se você tiver qualquer diretório / * entradas em seu arquivo gitignore.

A partir da versão 1.7.7 você pode usar git stash --include-untracked ou git stash save -u para esconder arquivos untracked sem preparo-los.

Add (git add) o arquivo e começar a segui-lo. Então esconder. Uma vez que todo o conteúdo do arquivo são novos, eles serão escondidos, e você pode manipulá-lo conforme necessário.

Outras dicas

A partir de git 1.7.7, git stash aceita a opção --include-untracked (ou -u de curto mão). Para incluir arquivos untracked em seu esconderijo, use um dos seguintes comandos:

git stash --include-untracked
git stash -u

Warning, fazendo isso irá excluir permanentemente seus arquivos se você tiver qualquer diretório / * entradas em seu arquivo gitignore.

Adicionar o arquivo para o índice:

git add path/to/untracked-file
git stash

Todo o conteúdo do índice, além de quaisquer alterações unstaged para arquivos existentes, tudo vai fazê-lo no esconderijo.

No bash git, stashing de arquivos untracked é conseguido usando o comando

git stash --include-untracked

ou

git stash -u

http://git-scm.com/docs/git-stash

git stash de remove qualquer arquivos untracked ou uncommited de seu espaço de trabalho. E você pode reverter git stash usando seguintes comandos

git stash pop

Isto irá colocar a parte de trás do arquivo no seu espaço de trabalho local.

Minha experiência

Eu tive que fazer uma modificação para o meu arquivo gitignore ao movimento evitar de .classpath e .project em repo remoto. Eu não estou autorizado a mover este .gitignore modificado no repo remoto a partir de agora.

.classpath e .project são importantes para eclipse - que é o meu editor java

.

I primeiro lugar seletivamente adicionei meu resto dos arquivos e comprometido para o estadiamento. No entanto, empurrão final não pode ser realizada a menos que os fiels .gitignore modificados e dos arquivos untracked viz. .project e .classpath não estão escondidos.

Eu costumava

 git stash 

para stashing o arquivo .gitignore modificado.

Para stashing .classpath e arquivo .project, eu usei

git stash --include-untracked

e removido os arquivos do meu espaço de trabalho. Ausência desses arquivos tira a minha capacidade de trabalhar no meu local de trabalho no eclipse. Eu continuei com a conclusão do procedimento para empurrar os arquivos comprometidos com remoto. Uma vez que isso foi feito com sucesso, eu usei

git stash pop

Esta colado os mesmos arquivos de volta na minha área de trabalho. Isso deu volta para mim a minha capacidade de trabalho no mesmo projeto no eclipse. Espero que isso afasta equívocos.

Como já foi dito em outros lugares, a resposta é git add o arquivo. por exemplo:.

git add path/to/untracked-file
git stash

No entanto, a questão é também levantada em outra resposta: E se você realmente não deseja adicionar o arquivo? Bem, tanto quanto eu posso dizer, você tem que. E a seguir irá não trabalho:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

este irá falhar, como se segue:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Então, o que você pode fazer? Bem, você tem que adicionar realmente o arquivo, no entanto , você pode efetivamente un-adicioná-lo mais tarde, com git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

E então você pode continuar a trabalhar, no mesmo estado em que estava antes de o git add. (Ou seja, com um arquivo untracked chamado path/to/untracked-file; além de quaisquer outras alterações que possa ter tido a arquivos rastreados)

Outra possibilidade para um fluxo de trabalho sobre isso seria algo como:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Nota: Como mencionado em um comentário de @mancocapac, você pode querer adicionar --exclude-standard ao comando git ls-files (assim, git ls-files -o --exclude-standard).]

... que também poderia ser facilmente o script - até mesmo aliases faria (apresentada na sintaxe zsh; ajustar conforme necessário) [também, eu encurtado o nome do arquivo para que tudo se encaixa na tela sem rolagem nesta resposta; fique à vontade para substituir um nome alternativo de sua escolha]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Note que este último pode ser melhor como um script ou função shell, para permitir que os parâmetros a serem fornecidos para git stash, no caso de você não quer pop mas apply, e / ou quer ser capaz de especificar um estoque específico, ao invés de apenas tomar o topo. Talvez este (em vez do segundo aliás, acima) [espaços em branco retirados para se ajustar sem rolagem; re-add para aumentar a legibilidade]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Nota : Neste formulário, você precisa fornecer um argumento acção, bem como o identificador se você estiver indo para fornecer um identificador stash, por exemplo, unstashall apply stash@{1} ou unstashall pop stash@{1}

O que é claro que você colocar na sua .zshrc ou equivalente para fazer existir a longo prazo.

Esperemos que esta resposta é útil para alguém, colocar tudo junto em um só resposta.

Na versão 2.8.1 git:. Seguindo obras para mim

Para salvar arquivos modificados e untracked em estoque sem um nome

git stash save -u

Para salvar arquivos modificados e untracked em esconderijo com um nome

git stash save -u <name_of_stash>

Você pode usar tanto pop e aplicar mais tarde como segue.

git stash pop

git stash apply stash@{0}

Eu era capaz de esconder apenas os arquivos untracked fazendo:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

O último aparece o esconderijo dos arquivos rastreados, deixando apenas os arquivos untracked escondido.

Se você quiser esconder arquivos untracked, mas manter os arquivos indexados (aqueles que você está prestes a cometer, por exemplo), basta adicionar -k (índice de sustento) opção para o -u

git stash -u -k

Você pode simplesmente fazê-lo com o comando abaixo

git stash save --include-untracked

ou

git stash save -u

Para saber mais sobre git stash de visite este post (clique aqui)

vamos supor que o arquivo novo e untracked é chamado: "views.json". se você quer mudar ramo por stashing o estado do seu aplicativo, eu geralmente digite:

git add views.json

Depois:

git stash

E seria escondido. Então eu só posso mudar ramo com

git checkout other-nice-branch

Existem várias respostas corretas aqui, mas eu queria salientar que para os novos diretórios inteiros, 'git add path' não trabalho. Então se você tem um monte de novos arquivos em untracked-path e faça o seguinte:

git add untracked-path
git stash "temp stash"

isso irá esconder com a seguinte mensagem:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

e se untracked-path é o único caminho que você está stashing, o esconderijo "temp estoque" será um esconderijo vazio. maneira correta é adicionar o caminho inteiro, e não apenas o nome do diretório (ou seja, acabar com o caminho com uma '/'):

git add untracked-path/
git stash "temp stash"

Eu pensei que isso poderia ser resolvido, dizendo git que o arquivo existe, ao invés de cometer todo o conteúdo de TI para a área de teste, e em seguida, chamar git stash. Araqnid descreve como fazer o primeiro.

git add --intent-to-add path/to/untracked-file

ou

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

No entanto, este último não funciona:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Eu costumava ponderar e desejo o mesmo recurso. Mas com o tempo, percebi que realmente não é necessário. Quando você esconder, não há problema em deixar os novos arquivos. Nada "ruim" pode acontecer com eles (quando você verificar outra coisa, git vai erro e não substituir o arquivo untracked existente)

E já que normalmente o período de tempo entre a git stash eo git stash pop é bastante pequena, você vai precisar do arquivo untracked rapidamente novamente. Então, eu diria a inconveniência do arquivo aparecer em git status enquanto você está trabalhando em outra coisa (entre a git stash eo git stash pop) é menor, então o inconveniente causado pelo trabalho e precisava de atenção que, de outra forma custar para tentar adicionar o arquivo untracked ao seu esconderijo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top