我什么时候应该使用git stash?

时间:2013-12-12 07:15:04

标签: git git-stash

如果我在分支A上工作并且在准备好在分支A上提交之前突然需要在分支B上工作,我将我的更改存储在A,结账B,在那里做我的工作,然后结账A并应用存储。

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

另外,另一种情况 - 我在工作和家庭工作。如果我想回家的时候还没准备好提交,我可以把我的工作藏起来,把它推到GitHub然后把它藏在家里吗?

9 个答案:

答案 0 :(得分:58)

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 --ammend

# back to work!
git stash pop

答案 1 :(得分:10)

您可以使用以下命令:

  • 要保存未提交的更改

    git stash

  • 要列出您保存的藏匿处

    git stash list

  • 要应用/获取x为0,1,2 ...的未提交的更改

    git stash apply stash@{x}

注意:

  • 要应用存储并将其从存储列表中删除

    git stash pop stash@{x}

  • 要应用存储并将其保存在存储列表中

    git stash apply stash@{x}

答案 2 :(得分:6)

我知道StackOverflow并不是提供基于意见的答案的地方,但实际上我对何时搁置更改具有很好的看法。

您不想进行实验性更改

在工作空间/工作树中进行更改时,如果需要执行任何基于分支的操作​​(如合并,推送,提取或拉取),则必须处于干净的提交点。因此,如果您有工作空间更改,则需要提交更改。但是,如果您不想提交它们怎么办?如果它们是实验性的怎么办?您不想部分提交历史吗?当您推送到GitHub时,您不希望其他人看到什么吗?

您不想通过硬重置丢失本地更改

在这种情况下,您可以进行硬重置。但是,如果您进行硬重置,您将丢失所有本地working tree更改,因为所有内容都会被覆盖到上一次提交时的位置,并且您将丢失所有更改。

因此,对于“何时存储”的答案是,当您需要使用同步的工作树/索引/提交返回到干净的提交点时,但又不想丢失过程中的局部变化。只要将您的更改搁置起来,就可以了。

完成储藏然后合并或拉动或推动后,只需stash pop or apply,您就可以回到起点。

Git隐藏和GitHub

GitHub一直在不断添加新功能,但是截至目前,现在有一种在其中保存存储的方法。同样,隐藏的想法是它是本地的和私有的。如果没有对工作站的物理访问,没有其他人可以窥视您的存储。 Kinda与git reflog私有和git log公开一样。如果将其推送到GitHub,它可能不是私有的。

一个技巧可能是对工作区进行差异处理,将差异检入git存储库,提交然后推送。然后,您可以从家里拉东西,拿到差异然后放开。但这是获得这些结果的相当混乱的方式。

git diff > git-dif-file.diff

pop the stash

答案 3 :(得分:4)

我将在三个段落上中断答案。
第1部分:
git stash #用于隐藏您所做的更改而无需提交
git checkout some_branch #用于处理其他任务,然后返回您的分支机构
git stash list #用于查看包含隐藏更改的列表

  

您可以看到:
存储@@ {0}:在{branch_name}上执行WIP:{上次提交的SHA-1} {您分支的最后一次提交}
存储@ {0}:在主机上的WIP:085b095c6   修改测试

git stash apply #用于应用存储列表中的最新更改
git stash apply stash@{12} #如果您有很多存储,则可以选择要应用的存储

git stash drop stash@{0} #用于从存储列表中删除

git stash pop stash@{1} #用于应用所选的存储并将其从存储列表中删除

第2部分:
您可以使用此命令隐藏更改,但这不是必需的。
您可以在第二天继续藏匿。
此命令用于隐藏更改并在不同分支上工作,或用于实现代码的某些实现并保存在没有分支的存储中,并提交您的自定义案例!
稍后您可以使用一些存储卡,并检查比较好。

第3部分:
本地存储命令隐藏您的更改。
如果要远程工作,则必须提交并推送。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

如果你在工作副本中有变化(而不是在暂存区域)时点击git stash,git将创建一个藏匿的对象并推送到堆栈的藏匿处(就像你git checkout -- .一样但你不会失去变化)。之后,您可以从堆栈顶部弹出。

答案 6 :(得分:1)

主要思想是

  

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

因此Basicallly Stash命令可以保留一些不需要或暂时不需要的更改;但您可能需要它们。

  

当您想记录当前状态时,请使用 git stash   工作目录和索引,但是想回到干净的位置   工作目录。该命令将您的本地修改保存下来   并还原工作目录以匹配 HEAD 提交。

答案 7 :(得分:1)

以上答案中已经提供了主要用例。

stash 的一个用例是,如果分支上的更改与 stash 中的更改不同,则在弹出或应用 stash 时可能会遇到冲突。

您可以使用 git stash branch 创建一个新分支以应用您的隐藏更改。例如,

git stash branch master_stash_newBranch stash@{1}

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

答案 8 :(得分:0)

您可以使用这两种方式来存储和启动或从上游创建一个新分支。 Stash 是保存撤消重做更改的更方便的方法。