【问题标题】:Why does Tools->Git->Stash fail in Qt Creator where Tools->Git->Undo Uncommitted Changes does not?为什么 Tools->Git->Stash 在 Qt Creator 中失败,而 Tools->Git->Undo Uncommitted Changes 没有?
【发布时间】:2013-02-06 22:07:36
【问题描述】:

有时 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 的重点不是自动化这个过程,为什么简单地撤消更改成功时它会失败?

【问题讨论】:

  • 请准确地说“失败”是什么意思
  • “撤消未提交的更改”做得如何?你的意思是git checkout -fgit reset --hard?你用的是gui还是什么的?
  • @CharlesB 谢谢,我更新了我的问题。顺便说一句,我通过 Qt Creator 使用 git,它与 IDE 集成。我从 Qt Creator 的日志中复制了这个。

标签: git qt-creator git-stash


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 2011-06-30
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2011-04-11
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多