如果我在分支A上工作,并且突然需要在分支B上工作,然后才准备在分支A上提交,那么我将我的更改存储在A上,签出B,在那里完成我的工作,然后签出A并应用存储。
如果我在A上工作,我想停止一天的工作,我是否应该保存我的工作,然后在第二天(当我恢复工作时)应用它,或者我应该让工作目录中的文件保持原样——未提交的修改文件?我不明白为什么在这种情况下我需要使用stash,除非有一些安全好处。
还有另一种情况:我在公司和家里都工作。如果当我想回家的时候,我还没有准备好提交,我可以把我的工作藏起来,推送到GitHub,然后在家里把它取出来吗?
我知道StackOverflow不是一个基于意见的回答的地方,但我实际上有一个很好的意见,什么时候搁置一个隐藏的变化。
您不会希望进行实验性的更改
当你在工作空间/工作树中进行更改时,如果你需要执行任何基于分支的操作,如合并、推、取或拉,你必须处于一个干净的提交点。因此,如果您有工作区更改,您需要提交它们。但如果你不想犯这些错误呢?如果它们是实验性的呢?一些你不想成为提交历史的一部分的东西?当你推送到GitHub时,你不想让别人看到的东西?
您不希望在硬复位时丢失本地更改
在这种情况下,您可以进行硬复位。但是如果你做了硬重置,你会失去所有的本地工作树的改变,因为所有的东西都会被覆盖到上次提交时的位置,你会失去所有的改变。
所以,至于“什么时候应该隐藏”的答案,答案是当你需要回到一个干净的提交点,使用同步的工作树/索引/提交,但你不想在这个过程中失去你的本地更改。只要把你的改动藏起来就行了。
一旦你完成了你的stash,然后合并或拉或推,你就可以只用stash pop或apply,你就回到了你开始的地方。
Git stash和GitHub
GitHub不断地添加新功能,但到目前为止,现在有一种方法可以保存在那里。再说一次,私藏的概念是本地的,私人的。没有人能在不接触你的工作站的情况下偷看你的收藏。就像git reflog是私有的,git log是公共的一样。如果它被推送到GitHub上,可能就不是私有的了。
一个技巧可能是对你的工作空间做一个diff,将diff签入你的git存储库,提交,然后推送。然后你可以从家里进行拉取,得到差异,然后unwind。但这是实现这些结果的一种相当混乱的方式。
git diff > git-dif-file.diff
Stash只是一个方便的方法。由于在git中分支是如此廉价且易于管理,我个人几乎总是喜欢创建一个新的临时分支而不是存储,但这主要是一个品味问题。
如果我发现我在上次提交中忘记了一些东西,并且已经开始在同一分支中处理下一个,那么我就会将它们存储在一个地方:
# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something
# stash away the current mess I made
git stash save
# some changes in the working dir
# and now add them to the last commit:
git add -u
git commit --amend
# back to work!
git stash pop