代码之家  ›  专栏  ›  技术社区  ›  holastello

Git说“在切换分支之前提交或隐藏更改”,但也“无需提交”

git
  •  1
  • holastello  · 技术社区  · 7 年前

    我正在尝试从 test1 到 test2 通过运行 git checkout test2 ,但出现以下错误:

    error: Your local changes to the following files would be overwritten by checkout:
        path/to/file.xml
    Please commit your changes or stash them before you switch branches.
    Aborting
    

    即使在我跑步的时候 git status 或 git commit 在…上 测试1 ,我明白了:

    On branch test1
    nothing to commit, working tree clean
    

    有趣的是,我可以在 master 和 测试1 没问题。

    这是怎么回事?我需要做什么才能切换到 测试2 ?

    0 回复  |  直到 7 年前
        1
  •  8
  •   torek    7 年前

    TL;博士

    您需要清除跳过工作树位并重新运行 git status 看看发生了什么。从那以后,事情(在某种程度上)会更清楚。

    长(ish)

    此处的问题是跳过工作树位设置为:

    path/to/file.xml
    

    有一个相关的位拼写为“假定不变”。两个位具有相同的实际效果。虽然文档和stackoverflow答案建议使用跳过工作树位, 1. 我在这里也是如此;但在实践中,两者都会做同样的事情。您必须记住(或重新发现)设置的位,以便清除它:

    git update-index --no-skip-worktree path/to/file.xml
    

    如果在名称和内容记录在索引中的文件上设置了任意一位,Git会假定应该使用通过索引存储的内容,并且在 git状态 和 git add 操作。

    幸运的是,Git足够聪明,可以在 另外 操作。如果Git即将 覆盖 工作树副本的原因如下 git checkout 或 git merge 如果提交的文件副本与当前索引副本不同,Git将再次检查 工作树 副本 path/to/file.xml 匹配索引副本。如果没有,Git将投诉该操作将覆盖工作树副本。

    不幸地 git状态 ,按设计, 没有 宣布工作树副本与索引副本不同步。它只是假设文件的两个版本都匹配。所以你跑了 git状态 没有要提交的更改,因此没有要保存的内容,但同时 git签出 或 合并分支 不断抱怨您必须提交更改。

    清除位,无论是哪个位,都会 git状态 注意问题。在我看来 git状态 这里应该提供更多信息:可能在使用额外选项时,或者可能总是这样,需要说 是 这里有一些区别,但由于这两个位中的一个或两个,它被故意忽略了。(为了使这一点在稀疏签出中很好地发挥作用,它可能不应该涉及标记的- --skip-worktree -索引中的文件,而不是工作树中的文件,并且被稀疏规则排除。)


    1. 假设unchanged用于 lstat 调用速度特别慢,Git可以忽略它。Skip worktree用于稀疏签出,Git是 不 允许忽略此项。Git也没有面向用户的稀疏签出命令,因此设置skip-worktree位更好。

        2
  •  -3
  •   Alberto Chaparro Terleira    6 年前

    Git reset为我解决了这个问题:

    git reset --hard