0

即使我可以使用未提交的更改手动备份项目文件夹,有时 git stash 也会失败,然后调用“撤消未提交的更改”。

例如,如果我将一个新文件添加foo.cpp到我的项目中,就会发生这种情况。当我想稍后存储更改时,我得到一个错误。这是来自 Qt Creator 中的版本控制输出窗格:

14:07 Executing in C:\MyProject: git.exe add --intent-to-add foo.cpp
14:07 Executing in C:\MyProject: git.exe stash save QtCreator 2013-02-05T14:07:18
Cannot stash in "C:\MyProject": error: Entry 'foo.cpp' not uptodate. Cannot merge.
Cannot save the current worktree state

git stash 的重点不是自动化这个过程,为什么简单地撤消更改成功时它会失败?

4

2 回答 2

2

--intent-to-add处于foo.cpp未添加但仍处于跟踪状态。(Do git cat-file -p $(git write-tree): foo.cpp 是正确的,不存在。Do git status:它被跟踪。但我相信没有人被教导git stash要记住这一点,因此合并它保存的状态foo.cpp不会被跟踪。因为git stash pop实际上合并到索引和工作树——你可以隐藏你的更改,从当前的 HEAD 为父,完全检查其他内容,然后git stash pop将隐藏内容中的更改应用到新的工作树——你看到的消息来自测试飞行合并stash运行以验证立即git stash pop数是否会使您的工作树和索引保持原样。但在这种情况下,它不会。 foo.cpp在您的索引中被跟踪,并且在隐藏的树中不存在。在该树中合并时(在没有意图添加数据的情况下),唯一明智的做法是将其解释为删除。但是你已经对你要求跟踪的文件进行了更改:合并可以看到你会丢失你告诉 git 你关心的内容。因此,合并拒绝运行,直到您自己删除文件或将其提交到存储库,并且 stash 拒绝创建您无法安全弹出的存储。

于 2013-02-06T03:51:24.663 回答
0

尝试运行git stash save -u而不是git stash.

于 2013-02-05T10:21:45.300 回答