git stash是分支专用的还是整个存储库的?


95

我进了一家分店,做了一些工作。我想进入另一个分支,但是不想这么做,所以我做到了git stash。然后我做到了git checkout <otherbranch>。我在那里做了一些工作,就像在第一个分支中一样,我想在提交工作之前先退出它。所以我git stash也在那里。我切换回第一个分支并尝试取消隐藏它(git stash pop),以为它将从该特定分支中获取隐藏信息。我很惊讶它没有藏起<otherbranch>(最新藏起来的)藏匿物。我的印象是存储是特定于分支的,但是此行为表明整个本地存储库只有一个存储。

git stash分支特定的还是整个存储库的?如果是用于整个存储库,是否可以向其传递选项以使其特定于分支?

Answers:


43

要查看当前的隐藏堆栈:

git stash list

要从堆栈中选择特定的存储,请按上图所示参考它。stash@{number}

如果您希望行为是按分支的,则只需在分支上进行一次提交(或多次提交)。您以后总是可以“取消”提交(例如,使用git reset--soft--mixed;请参见git reset文档;或)git rebase -i,仅保留最终的“真实”提交,而放弃临时使用)。

(要真正进行仿真,git stash您至少需要两次提交,一次用于索引状态,一次用于工作树状态。但是,如果您不打算保存和恢复索引状态,则可以只git add -A执行整个工作树状态另外,它git stash是一个shell脚本,因此您可以很容易地复制和修改它,以使其默认在每个分支工作,例如使用其工作名称空间,而不是单个全局变量。整个存储库。您仍然可以通过明确命名将存储库从一个存储库转移到另一个存储库。)refs/pb-stash/branchrefs/stash


stash list除了描述之外,您还知道如何显示每个项目的文件列表吗?
两栖游戏,2013年

2
git stash show(或git stash show stash@{<number>}其他@{0}版本除外)为您提供diff --stat; 添加-p以获得更大的差异。注意:这会将“存储袋”中的“工作树”与其挂起的提交进行比较;没有前端界面可以查看给定存储袋中“索引”中的内容。
torek 2013年

55

否,否git stash是每个存储库。

是一个关于如何使用它的漂亮页面。


第二个存储区是否会覆盖第一个存储区?IOW,如果我执行两次隐藏,但之间没有任何隐藏,我会丢失第一个隐藏吗?
两栖游戏,2013年

1
不,您会得到一堆(后进先出)的储藏物。你推藏匿到您的藏匿处堆,然后又那么你跳出第二个,那么你蹦出第一,等等
abasterfield

18

git stash 不是按分支的。

  • 而不是git stash(当您有很多隐藏物和分支时,它很容易丢失)
  • 我建议做一个git commit将未完成的代码保存在您的分支中,当您准备完成该代码时,请执行一个agit reset ${COMMIT_HASH_VALUE}来取回未完成的代码
  • git commitgit reset使用时一起正确地可以模拟git stash为一个特定分支

这是一个现实生活中常见的场景,它演示了commitandreset命令的价值和用法:

  • 您正在使用功能分支X,并且您的代码甚至没有编译或通过测试
  • 有一个漏洞的优先级高于当前的新功能,因此您必须立即进行漏洞修复
  • 而不是进行git隐藏(并且隐藏在混合中,因为您有很多隐藏和许多分支)
  • 您可以git commit在功能分支X上执行
    • 写下以COMMIT_HASH_VALUE备后用
  • 签出新分支Y进行热修复
  • 完成分支Y上的热修复(执行合并请求以使热修复进入基线并删除热修复分支)
  • 然后再次签出特征分支X
  • 弹出未编译或未通过测试的未完成的工作->只需执行 git reset ${COMMIT_HASH_VALUE}

(FYI默认git resetIS --mixed


2
在这种情况下进行重置的方便快捷方式是git reset HEAD~1
Sam A. Horvath-Hunt

1
@samHH我有一个实例太多,而git reset HEAD ^ 1偶然被击中了两次……所以我选择不使用HEAD^1HEAD~1
Trevor Boyd Smith,

11

我不确定为什么这里的每个答案都建议使用commit+模仿隐藏reset。Stash非常好用,尤其是在多个分支上工作时。当我在多个分支上工作时,我也不想提交,因为我希望所有修改的更改在返回时仍在编辑器中突出显示。

所以这是隐藏工作流程:

每当您必须切换分支但尚未准备好提交时,请将更改保存到堆栈中

git stash save "Your custom stash message"

当您返回分支机构时,请检查存储区

git stash list

在此处输入图片说明

如果您在分支机构FixIssue0203,则可以使用use,git stash pop因为它将套用顶部stash@{0}并将其从存储中删除。

但是,如果在in分支中ImproveReadme,则应首先应用stash 1 git stash apply stash@{1},然后从stack中删除stash 1 git stash drop stash@{1}

而已!

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.