Git藏匿问题

时间:2013-01-29 12:27:07

标签: git git-stash

我在git stash中遇到了一个问题。

比如说我在仓库中有3个文件说a.txt,b.txt & c.txt,目录很干净。

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

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

$ git stash save "First Stash"

不,如果我做$ git stash list,我会

stash@{0}: On master: First Stash

否,如果我修改第三个文本文件c.txt并将其隐藏起来并显示:

$ git stash save "Second Stash"

如果我做了$git stash list我没有最终获得foll结果,

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

藏匿号码和消息在这里混淆了。这里发生了什么?  现在,如果我弹出stash@{0},我会得到第一个藏匿内容,但此处的消息显示为第二个存储,但应该是First Stash。

这是我的工作流程

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

现在我将尝试应用第一个存储的存储@ {1}并应该应用文件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>...]'

2 个答案:

答案 0 :(得分:5)

Git的藏匿(默认情况下)为LIFO storage

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

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

$ git stash apply stash@{1}

答案 1 :(得分:1)

他们没有混在一起!

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

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

所以操作弹出总是让你最后放到那里。

此行为是设计

编辑:如果你需要翻转一下,然后单独弹出堆栈中的每个项目(藏匿) - 做一个真正的提交 - 和交互式rebase或其他..

编辑/编辑:做一个

git stash pop 

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

然后再次执行git stash pop,再次提交

现在您可以重新排序或删除单个提交 - 请查看此处:http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.html 或者搜索交互式变基(再次......下一次做分支这个概念要强大得多,然后藏匿)