git stash的预期用例是什么?


142

如果我在分支A上工作并且突然需要在分支B上进行工作,然后才准备在分支A上进行提交,那么我会将所做的更改存储在A上,结帐B,在那做我的工作,然后结帐A并应用该存储。

如果我在A上工作并且想停止一天的工作,我应该存放我的工作,然后在第二天(当我恢复工作时)应用它,还是应该保留原样?工作目录?我看不出为什么在这种情况下需要使用存储,除非有一些安全性好处。

此外,还有另一种情况:我在工作和在家中都工作。如果我想回家时还没有准备好提交,我可以将工作存储起来,将其推送到GitHub,然后将其存储在家里吗?


3
如果有的话,很大程度上取决于您的公司政策。您将如何选择“已接受”的答案?
守护进程画家

1
所说的这个问题只是在征求意见(我应该以这种方式还是这种方式使用git ?),因此应该将其关闭或编辑。
TylerH

Answers:


161

藏匿只是一种方便的方法。由于分支是如此便宜且易于在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

2
取消隐藏后,添加的丢失的东西是否会合并到隐藏中?(我对时间线在git中的工作方式仍然不满意–我认为您正在覆盖历史?)
Kiki Jewell

@KikiJewell弹出的更改将应用​​于索引-它们未提交。因此,如果git stash pop两次,您将失去这两个变更集之间的区别。
Mureinik

截至2017年10月下旬,在Git邮件列表上进行了广泛讨论,其中不推荐使用git stash save命令,而推荐使用现有替代方法git stash push。这样做的主要原因是git stash push引入了存储所选pathspec的选项,但某些选项git stash save不支持。
克里希纳·古普塔

39

我将在三段中回答。

第1部分:

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

git checkout some_branch(更改为预期的分支-在这种情况下some_branch

git stash list (列出藏匿处)

您可以看到:
stash @ {0}:在{branch_name}上执行WIP:{上次提交的SHA-1} {您分支的最后提交}}
stash @ {0}:在主服务器上进行WIP:085b095c6修改以进行测试

git stash apply (将隐藏应用于当前分支中的工作树)

git stash apply stash@{12}(如果您有很多存储,则可以选择要应用的存储-在这种情况下,我们将应用存储12

git stash drop stash@{0} (从存储清单中删除-在这种情况下,是存储 0

git stash pop stash@{1} (以应用选定的存储并将其从存储列表中删除)

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

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


10

主要思想是

将更改存储在脏的工作目录中

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

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


7

您可以使用以下命令:

  • 保存未提交的更改

    git stash

  • 列出您保存的存储

    git stash list

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

    git stash apply stash@{x}

注意:

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

    git stash pop stash@{x}

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

    git stash apply stash@{x}


4

如果git stash在工作副本中有更改时(而不是在暂存区中)发生更改,则git将创建一个隐藏对象并推入存储堆栈(就像您所做的一样,git checkout -- .但不会丢失更改)。稍后,您可以从堆栈顶部弹出。


2

stash命令将存储您自上次提交以来所做的所有更改。就您而言,如果您第二天要继续处理该文件,则没有任何隐藏的理由。我只会使用隐藏来撤消您不想提交的更改。


2
不,git stash不会更改您的分支。它尤其不会“还原”任何已提交的更改。它只会(临时)丢弃文件上所有未提交的更改。-看起来有些挑剔,但是在git的上下文中,这类单词具有非常特殊的含义。您真的不应该将这些混淆。
michas

感谢您指出了这一点。我相应地更改了答案。
Severin

在git中,“分支”定义为一系列提交。git stash不会触摸任何提交,因此根本不会修改任何分支。它不会从分支“删除”任何内容,也不会以任何方式“重置”它。分支保持不变,只有工作树中的文件改变。-那是两件事。
michas

它不会丢弃,而是“存储”您的更改!Git为存储保留了LIFO结构,因此存储实际上是一个推动,您可以从其顶部弹出。“丢弃”一词意味着您将失去任何东西,但不会丢失。
gyorgyabraham 2013年

1

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

您不想进行实验性更改

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

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

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

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

完成储藏然后合并或拉动或推送后,就可以藏匿流行或应用,然后回到开始的地方。

Git隐藏和GitHub

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

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

git diff > git-dif-file.diff

藏起来

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.