Se eu trabalho no branch A e de repente preciso trabalhar no branch B antes de estar pronto com um commit no branch A, eu escondo minhas mudanças em A, checkout B, faço meu trabalho lá, então registro A e aplico o stash.
Se eu trabalhar em A e quiser parar de trabalhar durante o dia, devo esconder meu trabalho e aplicá-lo no dia seguinte (quando eu retomar meu trabalho), ou devo apenas deixar as coisas como estão - arquivos modificados não confirmados no diretório de trabalho? Não vejo por que eu precisaria usar o stash neste caso, exceto se houver algum benefício de segurança.
Além disso, outro cenário: eu trabalho tanto no trabalho quanto em casa. Se eu não estiver pronto com um commit quando quiser ir para casa, posso esconder meu trabalho, enviá-lo para o GitHub e depois puxar para casa?
Respostas:
Stash é apenas um método de conveniência. Já que branches são tão baratos e fáceis de gerenciar no git, eu pessoalmente quase sempre prefiro criar um novo branch temporário do que stash, mas é principalmente uma questão de gosto.
O único lugar que eu gosto de esconder é se eu descobrir que esqueci algo em meu último commit e já comecei a trabalhar no próximo no mesmo branch:
fonte
git stash pop
duas vezes, perderá a distinção entre esses dois conjuntos de mudanças.git stash push
. A principal razão para isso é quegit stash push
introduz a opção de esconder pathspecs selecionados , algogit stash save
não compatível.Vou quebrar a resposta em três parágrafos.
Parte 1:
git stash
(Para salvar suas alterações não confirmadas em um "esconderijo". Observação: isso remove as alterações da árvore de trabalho!)git checkout some_branch
(mude para o ramo pretendido - neste casosome_branch
)git stash list
(lista stashes)git stash apply
(para aplicar o estoque à árvore de trabalho no ramo atual)git stash apply stash@{12}
(se você tiver muitos esconderijos, você pode escolher o que será aplicado - neste caso, aplicamos o estoque12
)git stash drop stash@{0}
(para remover da lista de estoque - neste caso, estoque0
)git stash pop stash@{1}
(para aplicar o estoque selecionado e retirá-lo da lista de estoque)Parte 2:
Você pode ocultar suas alterações com este comando, mas não é necessário.
Você pode continuar no dia seguinte sem esconder.
Este comandos para esconder suas mudanças e trabalhar em diferentes branches ou para implementação alguma realização de seu código e salvar em stashes sem branches e commits ou seu caso personalizado!
E depois você pode usar alguns dos stashes e verificar qual é o melhor.
Parte 3:
Comando Stash para local ocultar suas alterações.
Se você quiser trabalhar remotamente, deve confirmar e enviar.
fonte
A ideia principal é
Portanto, o comando Basicallly Stash mantém suas algumas alterações que você não precisa ou deseja no momento; mas você pode precisar deles.
fonte
Você pode usar os seguintes comandos:
Para salvar suas alterações não confirmadas
git stash
Para listar seus estoques salvos
git stash list
Para aplicar / recuperar as alterações não confirmadas onde x é 0,1,2 ...
git stash apply stash@{x}
Para aplicar um estoque e removê-lo da lista de estoque
git stash pop stash@{x}
Para aplicar um stash e mantê-lo na lista de stash
git stash apply stash@{x}
fonte
Se você acertar
git stash
quando tiver mudanças na cópia de trabalho (não na área de teste), o git criará um objeto escondido e o empurrará para a pilha de esconderijos (exatamente como você fez,git checkout -- .
mas você não perderá as alterações). Mais tarde, você pode saltar do topo da pilha.fonte
O comando stash irá esconder todas as mudanças que você fez desde seu último commit. No seu caso, não há motivo para esconder se você vai continuar trabalhando nisso no dia seguinte. Eu só usaria o stash para desfazer as alterações que você não deseja confirmar.
fonte
git stash
não vai mudar o seu ramo. Em especial, ele não "reverterá" quaisquer alterações confirmadas. Ele irá apenas (temporariamente) descartar quaisquer alterações não confirmadas em seus arquivos. - Pode parecer exigente, mas esse tipo de palavra tem um significado muito especial no contexto do git. Você realmente não deve misturar isso.git stash
não afetará nenhum commit e, portanto, não modificará nenhum branch. Ele não "removerá" nada de um branch e não o "redefinirá" de forma alguma. A ramificação permanece a mesma, apenas os arquivos na árvore de trabalho mudam. - Essas são duas coisas totalmente diferentes.Sei que StackOverflow não é o lugar para respostas baseadas em opinião, mas na verdade tenho uma boa opinião sobre quando arquivar alterações com um estoque.
Você não quer comprometer suas alterações experimentais
Quando você faz mudanças em sua área de trabalho / árvore de trabalho, se você precisa realizar qualquer operação baseada em ramificação, como mesclar, enviar, buscar ou puxar, você deve estar em um ponto de confirmação limpo. Portanto, se você tiver alterações no espaço de trabalho, precisará confirmá-las. Mas e se você não quiser cometê-los? E se eles forem experimentais? Algo que você não quer fazer parte do seu histórico de commits? Algo que você não quer que outras pessoas vejam ao enviar para o GitHub?
Você não quer perder as alterações locais com um hard reset
Nesse caso, você pode fazer uma reinicialização a frio. Mas se você fizer uma reinicialização a frio, você perderá todas as alterações da árvore de trabalho local porque tudo será sobrescrito para onde estava no momento do último commit e você perderá todas as suas alterações.
Então, quanto à resposta de 'quando você deve esconder', a resposta é quando você precisa voltar a um ponto de confirmação limpo com uma árvore / índice / confirmação sincronizada, mas você não quer perder suas mudanças locais em o processo. Apenas arquive suas mudanças em um estoque e você estará bem.
E uma vez que você tenha feito seu stash e então mesclado ou puxado ou empurrado, você pode apenas stash pop ou aplicar e você está de volta ao ponto de partida.
Git stash e GitHub
O GitHub está constantemente adicionando novos recursos, mas a partir de agora, agora há uma maneira de salvar um estoque lá. Novamente, a ideia de um esconderijo é que seja local e privado. Ninguém mais pode espiar seu estoque sem acesso físico à estação de trabalho. Da mesma forma que o git reflog é privado e o git log é público. Provavelmente não seria privado se fosse enviado ao GitHub.
Um truque pode ser fazer um diff em seu espaço de trabalho, verificar o diff em seu repositório git, fazer um commit e então enviar. Então você pode fazer um pull de casa, pegar o diff e depois desenrolar. Mas essa é uma maneira bastante complicada de alcançar esses resultados.
fonte