Pergunta

Em um pergunta anterior do Git, Daniel Benamy estava falando sobre um fluxo de trabalho no Git:

Eu estava trabalhando no master e comprometi algumas coisas e então decidi que queria adiar esse trabalho.Fiz backup de alguns commits e depois ramifiquei antes de começar meu trabalho de merda.

Ele queria restaurar seu estado de funcionamento para um momento anterior sem perder as alterações atuais.Todas as respostas giravam em torno, de várias maneiras, de algo como

git branch -m master crap_work
git branch -m previous_master master

Como isso se compara a git stash?Estou um pouco confuso tentando ver quais são os diferentes casos de uso aqui quando parece gosto de tudo git stash does já é tratado por ramificação…


@Jordi Bunster:Obrigado, isso esclarece as coisas.Acho que consideraria "esconder" um galho leve e sem nome.Portanto, qualquer coisa que o stash possa fazer, o branch também pode, mas com mais palavras.Legal!

Foi útil?

Solução

'stash' leva o não comprometido",sujo"coisas em sua cópia de trabalho e as guarda, deixando você com uma cópia de trabalho limpa.

Na verdade, não se ramifica.Você pode então aplicar o stash em cima de qualquer outro branch.Ou, a partir do Git 1.6, você pode fazer:

git stash branch <branchname> [<stash>]

para aplicar o stash no topo de um novo branch, tudo em um comando.

Então, o stash funciona muito bem se você não se comprometeu com o "errado"ramo ainda.

Se você já se comprometeu, o fluxo de trabalho descrito na sua pergunta é uma alternativa melhor.E por falar nisso, você está certo:O Git é muito flexível e com essa flexibilidade vem a funcionalidade sobreposta.

Outras dicas

Ao restaurar seu stash, suas alterações serão reaplicadas e você continuará trabalhando em seu código.

Para ocultar suas alterações atuais

$ git stash save 
Saved "WIP on master: e71813e..."

Você também pode ter mais de um estoque.O estoque funciona como uma pilha.Cada vez que você salva um novo estoque, ele é colocado no topo da pilha.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Note o stash@{0} papel?Esse é o seu ID de estoque.Você precisará dele para restaurá-lo mais tarde.Vamos fazer isso agora.O ID do stash muda a cada stash que você faz.stash@{0} refere-se ao último estoque que você fez.

Para aplicar um estoque

$ git stash apply stash@{0}

Você pode notar que o estoque ainda está lá depois de aplicá-lo.Você pode abandoná-lo se não precisar mais dele.

$ git stash drop stash@{0}

Ou, como o stash funciona como uma pilha, você pode retirar o último stash que salvou:

$ git stash pop

Se você quiser limpar todos os seus stashes, execute o comando ‘clear’:

$ git stash clear

Pode muito bem ser que você não use stashes com tanta frequência.Se você quiser apenas armazenar rapidamente suas alterações para restaurá-las mais tarde, poderá omitir o ID do armazenamento.

$ git stash
...
$ git stash pop

Sinta-se à vontade para experimentar o estoque antes de usá-lo em algum trabalho realmente importante.

Também tenho uma versão mais aprofundada disso postada no meu blog.

Sempre sou cauteloso com o git stash.Se você esconder algumas vezes, as coisas tendem a ficar complicadas.git stash list exibirá uma lista numerada de stashes que você criou, com mensagens, se você as tiver fornecido...Mas o problema está no fato de que você não pode limpar os stashes, exceto com um brutal git stash clear (que remove todos eles).Então, a menos que você seja sempre anal em dar mensagens superdescritivas para seus stashes (isso vai contra a filosofia do stash), você acabará com um monte de stashes incompreensíveis.

A única maneira que conheço de descobrir qual é usar gitk --all e localizar os esconderijos.Pelo menos isso permite que você veja em qual commit o stash foi criado, bem como a diferença de tudo incluído nesse stash.

Observe que estou usando o git 1.5.4.3 e acho que o 1.6 adiciona o git stash pop, que acho que aplicaria o stash selecionado e remova-o da lista.O que parece muito mais limpo.

Por enquanto, sempre tento diversificar, a menos que tenha certeza absoluta de que voltarei para aquele estoque no mesmo dia, mesmo dentro de uma hora.

Se você procura um fluxo de trabalho que possa ser mais adequado que o git stash, você pode querer dar uma olhada garrafa git.É um utilitário com o propósito de salvar e restaurar os vários estados de funcionamento do git como commits normais do git, capturando efetivamente o estado atual e pertinente de sua árvore de trabalho e todos vários estados de arquivo mostrados no status do git.

Principais diferenças de git stash:

  • git stash salva o estado sujo do git de forma restrita (arquivos modificados e arquivos adicionados no índice), enquanto git-bottle foi projetado para economizar tudo isso é diferente de HEAD, e diferencia de forma preservada entre caminhos modificados, modificados e não adicionados, não adicionados, não mesclados e os estados completos de rebase/mesclagem (somente caminhos sob .gitignore não são salvos).
  • git stash salva para armazenar objetos que você precisa controlar separadamente.Se eu escondesse algo há 2 semanas, talvez não me lembrasse, mas git-bottle salva como commit provisório para o branch atual.A ação inversa é git-unbottle que é o equivalente ao git stash pop.É possível enviar e compartilhar esses commits entre repositórios.Isso pode ser útil para compilações remotas, onde você tem outro repositório em um servidor remoto apenas para compilar ou para colaborar com outras pessoas na resolução de conflitos.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top