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

时间:2013-12-11 17:48:41

标签: git git-stash

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

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

4 个答案:

答案 0 :(得分:32)

否和编号git stash是每个存储库。

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

答案 1 :(得分:23)

要查看当前的存储堆栈:

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。您仍然可以通过命名将一个存储从一个分支存储到另一个分支明确。)

答案 2 :(得分:4)

git stash不是按分支的。

  • 代替git stash(当您有很多藏匿处和分支时很容易丢失)
  • 我建议执行git commit来将未完成的代码保存在分支中,当您准备完成代码时,请执行git reset ${COMMIT_HASH_VALUE}来将未完成的代码取回 < / li>
  • git commitgit reset正确使用 可以模拟特定分支的git stash

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

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

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

答案 3 :(得分:2)

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

这是隐藏工作流程:

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

git stash save "Your custom stash message"

返回分支时,请检查存储区

git stash list

enter image description here

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

但是,如果您在分支ImproveReadme中,则应首先应用存储1 git stash apply stash@{1},然后从堆栈git stash drop stash@{1}中删除存储1。

就是这样!