5

我在 git stash 中有一个问题。

比如说我a.txt,b.txt & c.txt在 repo 中有 3 个文件,并且目录是干净的。

现在我正在修改其中的 2 个文件:a.txt and b.txt.

现在我还没有完成对两个文件的更改,所以我通过 foll 命令将它们存储起来:

$ git stash save "First Stash"

不,如果我做 a $ git stash list,我会得到

stash@{0}: On master: First Stash

否,如果我修改第三个文本文件c.txt并将其存储起来,如图所示:

$ git stash save "Second Stash"

最后不,如果我这样做,$git stash list我会得到以下结果,

stash@{0}: On master: Second stash
stash@{1}: On master: First Stash

存储号码和消息在这里混淆了。这是怎么回事?现在,如果我弹出stash@{0}我得到第一个存储内容,但这里的消息反转显示为第二个存储但应该是第一个存储。

这是我的工作流程

admin:stud:/demo/stash_demo> ls
a.txt  b.txt
admin:stud:/demo/stash_demo> echo Hello World >> a.txt
admin:stud:/demo/stash_demo> git stash save "First"
Saved working directory and index state On master: First
HEAD is now at cff03c6 Initail Commit
admin:stud:/demo/stash_demo> echo Hello World >> b.txt
admin:stud:/demo/stash_demo> git stash save "Second"
Saved working directory and index state On master: Second
HEAD is now at cff03c6 Initail Commit

这些是我可用的藏匿处:

admin:stud:/demo/stash_demo> git stash list
stash@{0}: On master: Second
stash@{1}: On master: First

现在我将尝试应用 stash@{1} 这是第一个 stash 并且应该应用文件 a.txt

admin:stud:/demo/stash_demo> git stash apply `stash@{1}`
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   b.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

如上所示,我应用了最新的更改。

如果我尝试不带刻度线,那么它会给我 foll 错误。

admin:stud:/demo/stash_demo> git stash apply stash@{1}
fatal: ambiguous argument 'stash@1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
4

2 回答 2

5

Git 的 stash 是(默认情况下)一个LIFO storage

通过使用git stash applyorgit stash pop您将始终获得最后一个隐藏的补丁(也可以使用stash@{0},来引用,0是隐藏内的索引)。存储一个新补丁会将其置于其他隐藏补丁之上,从而将它们的索引增加一(stash@{0}将变为stash@{1})。

也就是说,如果您想应用或弹出除最后一个隐藏的补丁之外的补丁,则需要将其 ref 传递给命令:

$ git stash apply stash@{1}
于 2013-01-29T12:39:40.897 回答
1

他们没有混淆!

存储将“提交”(我知道这里不是正确的词)存储在堆栈中:

http://en.wikipedia.org/wiki/Stack_(abstract_data_type)

所以 pop 操作总是让你得到你放在那里的最后一件事。

此行为是设计使然

编辑:如果你需要翻转一些东西,然后单独弹出堆栈(存储)中的每个项目 - 做一个真正的提交 - 和交互式 rebase 或任何..

编辑/编辑:做一个

git stash pop 

然后提交您的更改(无论此提交是否有用)

然后再做git stash pop一次,再次提交

现在您可以重新排序或删除单个提交 - 看看这里:http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.html 或搜索交互式变基(再次..下一个时间做一个分支这个概念比存储更强大)

于 2013-01-29T12:38:26.043 回答