Git:由于存在未提交的更改,无法进行变基

51

Git不允许我从任何地方rebase。

Cannot rebase: Your index contains uncommitted changes.
Please commit or stash them.

按照这个答案的说明:

$ git update-index -q --ignore-submodules --refresh
$ git diff-files --ignore-submodules

两个都不会产生任何输出,但其中一个确实可以:

$ git diff-index --cached --ignore-submodules HEAD --
:100644 000000 cab819f1e5ed6cc7cff374eecae273e1d6ae6a01     0000000000000000000000000000000000000000 D  .idea/codeStyleSettings.xml
:100644 000000 2953f353d2c65dd62e36926accb7f645a600b7e0 0000000000000000000000000000000000000000 D  .idea/dictionaries/roxy.xml
:100644 000000 0e7ecef362d8a77067edf4bae5972f33185bd986 0000000000000000000000000000000000000000 D  .idea/inspectionProfiles/Project_Default.xml
:100644 000000 3b312839bf2e939fea3ebdef15630a4b33e57caf  0000000000000000000000000000000000000000 D    .idea/inspectionProfiles/profiles_settings.xml
:100644 000000 e31af55b33d82e28f471a2ba51b63c2a91fa53b7 0000000000000000000000000000000000000000 D  .idea/php.xml
:100644 000000 9c25e8d4f1169b5d3103b14fdb60e7d7c3975b70 0000000000000000000000000000000000000000 D  db/sfront.sql

我无法删除这些文件:

$ git rm --cached .idea/php.xml
fatal: pathspec '.idea/php.xml' did not match any files

有什么想法可以帮助我吗?

编辑: git stash

解决了我的问题。虽然我不确定发生了什么,但被抱怨的文件应该被忽略了。


看起来问题已经解决了,谢谢。 - Pixy
文件不能被同时忽略和成为您的存储库的一部分。如果 git 检测到这些文件中的更改,则它们先前已被添加到存储库中(这意味着即使它们列在.gitignore 中,它们也不会被忽略——毕竟,您告诉 git 它们很重要)。 - larsks
有道理。我注意到一些文件后添加了它们,这没问题,但为什么不能用git rm删除它们呢?而git stash又是如何解决这个问题的呢?只是好奇,想要了解发生了什么。 - Pixy
2个回答

82

git stash 命令会将不同的文件存储到一个特殊的地方,使你的工作目录回到最后一次提交时的状态。完成代码变基后,运行 git stash pop 命令,可以将这些文件还原到工作目录中,让你像之前一样继续工作。

编辑:学习关于 git stash 命令的更多信息,可以参考这个链接:Git 工具 - 存储和清理


2
谢谢澄清。那我还有一个问题,当我尝试提交时,Git说它没有发现任何更改。为什么提交没有看到任何更改,但是stash却看到了呢? - Pixy
你之后执行了 git stash pop 吗? - jamesthollowell
1
不,我不需要那些文件。.idea 文件夹中的所有文件都来自于我的集成开发环境和旧版数据库备份。如果它们保留在存储区中,会对我未来造成问题吗? - Pixy
可能吧。我认为基本上意味着你不能再使用 git stash 了。如果你没有弹出存储,那就是为什么 git 看不到任何更改的原因。 - jamesthollowell
在我执行了git stash之前,它没有看到更改。有没有办法可以清除stash?我不关心那些文件。 - Pixy

12

也许现在还不需要用金铲子,但是当我在重定向具有未提交更改的代码时,我总是使用--autostash选项,如下:

git rebase --interactive SHA_WHERE_REBASE_ONTO^ --autostash


2
git rebase --autostash [branch to rebase] 应该也能正常工作。 - J.D.1731

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接