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

amp*_*ent 72 git git-stash

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

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

aba*_*eld 46

No和No. git stash是per-repository.

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

  • “不和不”是一个令人困惑的答案,因为OP的第一个问题是非此即彼。 (15认同)

tor*_*rek 29

要查看当前的存储堆栈:

git stash list
Run Code Online (Sandbox Code Playgroud)

要从堆栈中选择特定的存储,请按上面所示进行参考.stash@{number}

如果您希望行为是每个分支,则可以在分支上进行提交(或多次提交).您可以随时"unmake"提交(或多个)后(例如,使用git reset,无论是--soft--mixed;看到git的重置文件 ;或者git rebase -i只保留最后的"真实"而丢弃的临时提交(S)).

(要真正模拟,git stash您至少需要两次提交,一次用于索引状态,一次用于工作树状态.但是,如果您不打算保存并恢复索引状态,则可以只git add -A使用整个工作树状态并提出,在临时提交,或者git stash是一个shell脚本,所以你可以复制并很容易地修改它,使其在默认情况下每个分支上工作,使用,例如,它的工作名称空间,而不是单一的全球性的整个回购.你仍然可以通过明确命名将一个藏匿处从一个分支带到另一个分支.)refs/pb-stash/branchrefs/stash

  • git stash show`(或git stash show stash @ {&lt;number&gt;}的版本而不是@@ {0}版本的)给你一个`diff --stat`; 加`-p`得到更大的差异。注意:这会将[“ stash bag”](http://stackoverflow.com/a/20412685/1256452)中的“工作树”与其挂起的提交进行比较;没有前端界面可以查看给定存储袋中“索引”中的内容。 (2认同)

Ada*_*dam 20

我不确定为什么这里的每个答案都建议用commit+模拟 stash reset。Stash 非常好用。

所以这里是 stash 工作流程:

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

git stash save "Your custom stash message"
Run Code Online (Sandbox Code Playgroud)

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

当你返回一个分支时,检查存储

git stash list
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

就是这样!

  • 你救了我的命,我藏在多个分支上,当我 git stash pop 时,我看到了一个冲突,这不是我想要弹出的。我以为它已经写完了,我失去了我的旧藏品。但是 ```git stash list``` 和 ```git stash apply stash@{1}``` 让我挑选出我的旧存储。这节省了我很多时间。谢谢! (2认同)

Tre*_*ith 12

git stash 不是按分支的。

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

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

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

(FYI默认git resetIS --mixed

  • 在这种情况下进行重置的方便快捷方式是“ git reset HEAD〜1”。 (2认同)
  • 如果 stash 不是特定于分支的,为什么它会告诉您“On BranchName”?只是为了帮助您跟踪它的来源? (2认同)