Git 存储是特定于分支的还是针对整个存储库的?

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

git stash是特定于分支的还是针对整个存储库的?如果它是针对整个存储库的,那么是否可以向它传递选项,使其成为特定于分支的?

39894 次浏览

没有和没有。 git 存储是每个存储库。

这里 是一个关于如何使用它的很好的页面。

查看当前存储堆栈:

git stash list

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

如果希望每个分支都有相应的行为,只需对分支进行一次提交(或多次提交)。您总是可以在以后“取消”提交(例如,使用 git reset--soft或者 --mixed; 参见 Git 复位文档; 或者使用 git rebase -i只保留最终的“实际”提交,同时丢弃临时提交)。

(要真正模拟 git stash,至少需要两次提交,一次用于索引状态,一次用于工作树状态。但是,如果您不打算保存和恢复索引状态,那么只需要 git add -A整个工作树状态并将其放入临时提交中。另外,git stash是一个 shell 脚本,因此您可以很容易地复制和修改它,使其在默认情况下对每个分支工作,使用,例如,refs/pb-stash/branch作为其工作名称空间,而不是整个回购的单个全局 refs/stash。您仍然可以通过显式命名将存储从一个分支带到另一个分支。)

git stash不是每个分支。

  • 而不是 git stash(当你有大量的存货和分支机构时,它很容易丢失)
  • 我建议做一个 git commit,以保存未完成的代码在您的分支,当您准备完成代码做一个 git reset ${COMMIT_HASH_VALUE},以获得未完成的代码回来
  • 如果正确使用 一起git commitgit reset可以模拟特定分支的 git stash

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

  • 您正在处理特性分支 X,而您的代码甚至不能编译或通过测试
  • 有一个 bug 的优先级高于当前的新特性,因此您必须立即开始修复这个 bug
  • 而不是做一个 git 存储(而且存储会在混合中丢失,因为您有许多存储和许多分支)
  • 你可以在功能分支 X 上做 git commit
    • 写下 COMMIT_HASH_VALUE以备后用
  • 为热修复检查一个新的分支 Y
  • 完成对分支 Y 的热修复(执行合并请求将热修复放入基线并删除热修复分支)
  • 然后再次签出特性分支 X
  • 突破你未完成的工作,没有编译或通过测试-> 只是做一个 git reset ${COMMIT_HASH_VALUE}

(供参考,git reset的默认值是 --mixed)

我不知道为什么这里的每个答案都建议使用 commit + reset来模拟存储。

这就是藏匿的工作流程:

当您必须切换分支时,如果还没有准备好提交,请将更改保存到堆栈中

git stash save "Your custom stash message"

(如果不需要自定义消息,只需使用 git stash)。

当您返回到一个分支时,您可以看到这样的存储列表:

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。

就是这样!

如果您只想存储单个文件,那么事情就有点棘手了。阅读 https://stackoverflow.com/a/12305243/2311074了解更多信息。如果您碰巧使用 jetbrain,那么它有一个叫搁置的特性,这样您就可以挑选以后可能需要重用的文件: https://www.jetbrains.com/help/idea/shelving-and-unshelving-changes.html(它不是 GIT 的一部分)