git stash是特定于分支还是整个存储库?

问题描述 投票:52回答:3

我进了一个分店做了一些工作。我想进入另一个分支,但不想承诺,所以我做了git stash。然后我做了git checkout <otherbranch>。我在那里做了一些工作,就像在第一个分支中一样,我想在提交工作之前切换它。所以我也在那里做了git stash。我切换回第一个分支并尝试解除它(git stash pop)认为它会从特定分支中获取存储。我很惊讶它从<otherbranch>(最近被藏起来)中取出了藏匿物。我的印象是存储是特定于分支的,但是这种行为表明整个本地存储库只有一个存储。

git stash是特定于分支还是整个存储库?如果是整个存储库,我可以将选项传递给它以使其特定于分支吗?

git git-stash
3个回答
22
投票

要查看当前的存储堆栈:

git stash list

要从堆栈中选择特定的存储,请通过上面显示的stash@{number}引用它。

如果您希望行为是每个分支,则可以在分支上进行提交(或多次提交)。您可以随时“取消”提交(例如,使用git reset--soft--mixed;请参阅git reset documentation;或使用git rebase -i仅保留最终的“真实”提交,同时丢弃临时值)。

(为了真正模拟git stash,你需要至少两次提交,一次用于索引状态,一次用于工作树状态。但是,如果你不打算保存和恢复索引状态,你可以只是git add -A整个工作 - 树状态并将其置于临时提交中。或者,git stash是一个shell脚本,因此您可以非常轻松地复制和修改它,使其默认工作在每个分支上,使用例如refs/pb-stash/branch作为其工作名称空间,而不是整个仓库的单一全球refs/stash。您仍然可以通过明确命名将一个藏匿点从一个分支带到另一个分支。)


32
投票

No和No. git stash是per-repository。

Here是一个关于如何使用它的好页面。


4
投票

git stash不是每个分支。

  • 而不是git stash(当你有很多的存储和分支时,它很容易丢失)
  • 我建议做一个git commit来保存你的分支中未完成的代码,当你准备完成代码时,做一个git reset ${COMMIT_HASH_VALUE}来获取未完成的代码
  • git commitgit reset正确使用时可以模拟特定分支的git stash

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

  • 您正在使用功能分支X,您的代码甚至无法编译或通过测试
  • 有一个比当前新功能更高优先级的错误,因此您必须立即开始修复错误
  • 而不是做一个git stash(并且由于你有许多stashes和许多分支,stash在混合中丢失)
  • 你可以在功能分支X上做一个git commit 记下COMMIT_HASH_VALUE以供日后使用
  • 结帐新的分支Y进行热修复
  • 完成分支Y上的热修复(执行合并请求以获取热修复到基线并删除热修复分支)
  • 然后再次检查功能分支X.
  • 弹出未编译或通过测试的未完成的工作 - >只做一个git reset ${COMMIT_HASH_VALUE}

(仅供参考,git reset的默认值为--mixed

© www.soinside.com 2019 - 2024. All rights reserved.