如果我在分支A上工作,并且突然需要在分支B上工作,然后才准备在分支A上提交,那么我将我的更改存储在A上,签出B,在那里完成我的工作,然后签出A并应用存储。

如果我在A上工作,我想停止一天的工作,我是否应该保存我的工作,然后在第二天(当我恢复工作时)应用它,或者我应该让工作目录中的文件保持原样——未提交的修改文件?我不明白为什么在这种情况下我需要使用stash,除非有一些安全好处。

还有另一种情况:我在公司和家里都工作。如果当我想回家的时候,我还没有准备好提交,我可以把我的工作藏起来,推送到GitHub,然后在家里把它取出来吗?


stash命令将保存自上次提交以来所做的任何更改。在你的情况下,如果你第二天要继续工作,就没有理由把它藏起来。我只会使用stash来撤销您不想提交的更改。


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

如果你在工作副本中有更改(不在staging区域)时点击git stash, git将创建一个存储对象并将其推入存储堆栈(就像你做git checkout—一样)。但是你不会失去变化)。稍后,您可以从堆栈顶部弹出。


主要思想是

将更改保存在一个脏工作目录中

所以基本上Stash命令保留你的一些改变,你不需要他们或想要他们在此刻;但你可能需要它们。

的当前状态时使用git stash 工作目录和索引,但要回一个干净 工作目录。该命令保存您的本地修改 并返回工作目录以匹配HEAD提交。


我将分三段回答。

第1部分:

将未提交的更改保存在“stash”中。注意:这将从工作树中删除更改!)

Git签出some_branch(更改为预期的分支——在本例中是some_branch)

Git存储列表(列表存储)

你可以看到:stash@{1}: WIP在{branch_name}:{上次提交的SHA-1}{上次提交你的分支}在master上:085b095c6 测试修改

Git stash应用(应用stash到当前分支的工作树)

Git stash应用stash@{12}(如果你有很多存储,你可以选择哪个stash将应用-在这种情况下,我们应用stash 12)

Git stash drop stash@{0}(从stash列表中删除——在这种情况下是stash 0)

Git stash pop stash@{1}(应用所选的stash并将其从stash列表中删除)

第2部分: 您可以使用此命令隐藏更改,但这不是必需的。 第二天你可以不带毒品继续。 这个命令隐藏你的更改,并在不同的分支上工作,或者实现你的代码的一些实现,并保存在没有分支的存储中,并提交你的自定义案例! 之后你可以使用一些存储来检查哪个更好。

第3部分: 隐藏命令用于本地隐藏您的更改。 如果你想远程工作,你必须承诺并推动。


可以使用以下命令:

保存未提交的更改 git藏 列出您保存的存储 Git藏匿清单 应用/取回未提交的更改,其中x为0,1,2… Git存储应用

注意:

应用一个收藏并将其从收藏列表中删除 Git的stash pop @{x} 应用一个收藏并将其保存在收藏列表中 Git存储应用


我知道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的一个用例是,如果分支上的更改偏离了你的stash中的更改,你可能会在弹出或应用你的stash时遇到冲突。

您可以使用git stash分支来创建一个新的分支来应用您所存储的更改。例如,

git stash branch master_stash_newBranch stash@{1}

这将根据创建存储的提交检出一个新分支,然后将存储的更改弹出到该分支上。


两种方法都可以使用,既可以保存并启动,也可以从上游创建一个新分支。Stash是更方便的方法来保存撤销重做你的改变。


也许你可以把stash看作是一个临时的“私人”提交。当您隐藏时,您没有添加到其他人将看到的提交历史。这是在你需要很快把东西藏起来的情况下。

举个简单的例子:您需要快速返回到主分支(无论出于什么原因),没有时间添加到staging区域或进行适当的提交(可能您没有时间检查您所做的工作,并且不能快速提出清晰的提交消息和描述?)

一个可怕的承诺将会被所有人看到。Stash类似于提交,你可以为自己添加一条消息,重置工作目录,然后你可以稍后回来,你将是唯一可以看到它的人。至少,我不相信推送存储是一种默认行为。

这里还提到了许多其他用途。

将stash看作是git存储库“机器”之外的存储区域,与所有分支分离,因此您可以从任何地方访问它。