Eu sempre tive a impressão de que você poderia dar um nome a um stash fazendo git stash save stashname
, que você poderia aplicar mais tarde git stash apply stashname
. Mas parece que, neste caso, tudo o que acontece é que stashname
será usado como a descrição do stash.
Não há como realmente nomear um esconderijo? Caso contrário, o que você recomendaria para obter funcionalidade equivalente? Essencialmente, eu tenho um pequeno estoque que gostaria de aplicar periodicamente, mas não quero sempre ter que caçar git stash list
qual é o seu número real.
git stash push -m stashname
é a sintaxe atual .git stash save stashname
foi descontinuado.Respostas:
É assim que se faz:
Onde
"my_stash"
está o nome do esconderijo.Algumas coisas mais úteis a saber: Todos os stashes são armazenados em uma pilha. Tipo:
Isso listará todos os seus esconderijos.
Para aplicar um stash e removê-lo da pilha stash, digite:
Para aplicar um stash e mantê-lo na pilha stash, digite:
Onde
n
está o índice da alteração oculta.fonte
git stash apply <custom-name>
git stash push -m my_stash
é a sintaxe atual .git stash save my_stash
foi descontinuado.git stash save
foi descontinuado a partir de 2.15.x / 2.16; em vez disso, você pode usargit stash push -m "message"
Você pode usá-lo assim:
git stash push -m "message"
onde "mensagem" é sua nota para esse esconderijo.
A fim de recuperar o estoque você pode usar:
git stash list
. Isso produzirá uma lista como esta, por exemplo:Então você simplesmente usa
apply
o seguintestash@{index}
:Referências página de manual git stash
fonte
push
ao invés desave
sintaxe: empurrar git stashgit stash push
git stash apply stash@{1}
no Powershell, você receberá umaerror: unknown switch 'e'
resposta. Em vez disso, usegit stash apply --index 1
ougit stash apply 'stash@{1}'
ou escape}
e{
com um backtick `.Você pode transformar um esconderijo em um galho, se achar que é importante o suficiente:
na página do manual:
Isso cria e efetua o check-out de uma nova ramificação denominada
<branchname>
a partir da confirmação na qual a<stash>
criação original foi criada, aplica as alterações registradas na<stash>
nova árvore e índice de trabalho e elimina a opção<stash>
se for concluída com êxito. Quando não<stash>
é dado, aplica o mais recente.Isso é útil se a ramificação na qual você executou
git stash save
mudou o suficiente para que a aplicação do git stash falhe devido a conflitos. Como o stash é aplicado na parte superior da confirmação que era HEAD no momento em que o git stash foi executado, ele restaura o estado originalmente stashed sem conflitos.Mais tarde, você pode refazer esse novo ramo para outro local que descende de onde estava quando se escondeu.
fonte
git stash apply
)git stash push -m 'name'
trabalhou.Se você está apenas procurando uma maneira leve de salvar algumas ou todas as alterações atuais na sua cópia de trabalho e depois reaplicá-las à vontade, considere um arquivo de patch:
De vez em quando eu me pergunto se eu deveria usar esconderijos para isso e depois vejo coisas como a loucura acima e estou contente com o que estou fazendo :)
fonte
Os esconderijos não devem ser permanentes como você deseja. Você provavelmente seria melhor servido usando tags em confirmações. Construa o que você deseja esconder. Faça um commit com isso. Crie uma tag para esse commit. Em seguida, reverta sua ramificação para
HEAD^
. Agora, quando você quiser reaplicar esse esconderijo, poderá usargit cherry-pick -n tagname
(-n
é--no-commit
).fonte
named commit
ficar em algum lugar. Apenas um aborrecimento leve é que ele não é confirmado na seleção de cereja e permanece no diff, o que significa que precisará ser manualmente não verificado durante a próxima confirmação.--no-stage
opção! Relacionado: stackoverflow.com/questions/32333383/…use
git stash push -m aNameForYourStash
para salvá-lo. Em seguida, usegit stash list
para aprender o índice do stash que você deseja aplicar. Em seguida, usegit stash pop --index 0
para abrir o esconderijo e aplicá-lo.note: estou usando a versão 2.21.0.windows.1 do git
fonte
git stash {push,save}
Eu tenho essas duas funções no meu
.zshrc
arquivo:Utilizando-os desta maneira:
fonte
Que tal isso?
fonte
git stash apply stash^{/<regex>}
não funcione (não funciona) pesquise na lista stash, veja os comentários na resposta aceita ).git stash list
que me mostra os stashes junto com o número de índice associado, depois vou 2.git stash apply 0
- onde 0 é o número de índice que eu teria procurado desde o primeiro comandoAlias
sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"
Uso
git sapply "<regex>"
Edit: Aderi à minha solução original, mas vejo por que a maioria prefere a versão de Etan Reisner (acima). Então, só para constar:
fonte
awk -F: '{print $1}'
eliminaria totalmente a necessidade do sed. Também por que envolver isso em uma função? E usar tambémawk -F: -vpat="$*" '$0 ~ pat {print $1}'
deve permitir o cancelamento do grep. Embora possa exigir citações ligeiramente diferentes para o padrão.{print $1; exit}
para sair após a primeira linha correspondente.É uma pena que
git stash apply stash^{/<regex>}
isso não funcione (na verdade, ele não pesquisa na lista stash, veja os comentários na resposta aceita ).Aqui estão as substituições drop-in que pesquisam
git stash list
por regex para encontrar o primeiro (mais recente)stash@{<n>}
e depois o passam paragit stash <command>
:Observe que os códigos de resultado adequados são retornados para que você possa usar esses comandos em outros scripts. Isso pode ser verificado após a execução de comandos com:
Apenas tome cuidado com explorações de expansão variável, porque eu não tinha certeza sobre a
--grep=$1
parte. Talvez devesse ser,--grep="$1"
mas não tenho certeza se isso interferiria nos delimitadores de expressões regulares (estou aberto a sugestões).fonte
Esta resposta deve muito a Klemen Slavič. Eu teria acabado de comentar a resposta aceita, mas ainda não tenho representante suficiente :(
Você também pode adicionar um alias do git para encontrar o ref do stash e usá-lo em outros aliases para mostrar, aplicar, soltar etc.
Observe que o motivo do
ref=$( ... ); echo ${ref:-<no_match>};
padrão é que uma string em branco não seja retornada, o que causaria ao sshow, sapply e sdrop direcionar o stash mais recente em vez de falhar, como seria de esperar.fonte
Alias Essa pode ser uma sintaxe mais direta para sistemas similares ao Unix, sem a necessidade de encapsular uma função. Adicione o seguinte a ~ / .gitconfig em [alias]
Uso: sapply regex
Exemplo: git sshow MySecretStash
O hífen no final diz receber informações da entrada padrão.
fonte
Use um pequeno script bash para procurar o número do stash. Chame de "gitapply":
Uso:
... onde foo é uma subcadeia do nome do esconderijo que você deseja.
fonte
Usar
git stash save NAME
para salvar.Então ... você pode usar este script para escolher qual aplicar (ou pop):
Eu gosto de poder ver os nomes dos esconderijos e escolher. Também uso o Zshell e, francamente, não sabia como usar alguns dos aliases do Bash acima;)
Nota: Como Kevin diz, você deve usar tags e cherry picks.
fonte
git stash save
foi descontinuado em favor degit stash push
.Esta é uma maneira de fazer isso usando o PowerShell:
Mais detalhes aqui
fonte
na minha concha de peixe
usar
gsap name_of_stash
fonte
Tarde para a festa aqui, mas se você estiver usando o VSCode, uma maneira rápida de fazer isso é abrir a paleta de comandos (CTRL / CMD + SHIFT + P) e digitar "Pop Stash", você poderá recuperar o seu stash pelo nome sem a necessidade de usar git CLI
fonte
git stash apply
também funciona com outros árbitros que nãostash@{0}
. Portanto, você pode usar tags comuns para obter um nome persistente. Isso também tem a vantagem de você não poder acidentalmentegit stash drop
ougit stash pop
isso.Então você pode definir um alias
pstash
(também conhecido como "stash persistente") como este:Agora você pode criar um stash marcado:
e
show
eapply
-lo novamente como de costume:fonte
Eu não acho que haja uma maneira de colocar um esconderijo com seu nome.
Eu criei uma função bash que faz isso.
Exemplo de uso:
Espero que ajude!
fonte
Para tudo, além da criação do stash, eu proporia outra solução introduzindo o fzf como uma dependência. Eu recomendo que você dedique 5 minutos do seu tempo e seja apresentado a ele, pois é um grande impulsionador da produtividade.
De qualquer forma, um trecho relacionado da página de exemplos oferece pesquisa de esconderijo. É muito fácil alterar o scriptlet para adicionar funcionalidades adicionais (como aplicação stash ou dropping):
fonte
Portanto, não sei por que há tanta consternação nesse tópico. Posso nomear um stash com um push e o save obsoleto, e posso usar um regex para recuperá-lo com uma aplicação:
Método stash Git para usar um nome para aplicar
Como mencionado anteriormente, o comando save foi descontinuado, mas ainda funciona, portanto, você pode usá-lo em sistemas mais antigos, onde não pode atualizá-los com uma chamada por push. Diferente do comando push, a opção -m não é necessária com o save.
Problemas com um pop e drop
Não acredito que funcione com um pop, mas acho que é porque o pop executa uma queda após a aplicação e o regex não é amigável com a queda. Isso é apenas um palpite. Eu não testei.
Este é o Git 2.2 e o Windows 10.
Prova Visual
Aqui está um belo GIF animado demonstrando o processo.
Sequência de eventos
O GIF é executado rapidamente, mas se você olhar, o processo é o seguinte:
Isso faz algum sentido?
Para ser franco, não tenho certeza de qual é o benefício dessa abordagem. É importante dar um nome ao esconderijo, mas não a recuperação. Talvez para criar um script do processo, seria útil, mas ainda é muito mais fácil colocar um esconderijo por nome.
Isso me parece muito mais fácil do que o regex.
fonte