“解释”;过度的局部变化”;在这种情况下切换git中的分支时发出警告?

“解释”;过度的局部变化”;在这种情况下切换git中的分支时发出警告?,git,Git,几天前我克隆了一个存储库,为了运行cod,我需要修改类路径。今天有人告诉我拉X分支,我是用git pull做的 现在,当我执行git checkout X时,我会收到一条关于类路径文件的警告 Stash or commit it to prevent local changes from being overwritten. 为了重新创建此警告,我在其他项目中尝试了两种方案 第一种情况 在git回购中。在文件中进行更改而不是提交。然后创建一个新分支并签出到它。在这种情况下,它不会抛出此警告 第

几天前我克隆了一个存储库,为了运行cod,我需要修改类路径。今天有人告诉我拉X分支,我是用git pull做的

现在,当我执行git checkout X时,我会收到一条关于类路径文件的警告

Stash or commit it to prevent local changes from being overwritten.
为了重新创建此警告,我在其他项目中尝试了两种方案

第一种情况 在git回购中。在文件中进行更改而不是提交。然后创建一个新分支并签出到它。在这种情况下,它不会抛出此警告

第二种情况 在另一份回购协议中

  • 提交一个新文件
  • 创建一个分支,签出到该分支,对该文件进行更改并提交
  • 切换回主机,进行本地更改,而不是提交。然后,如果我调用
    git checkout X
    ,它会抛出该警告
  • 我真的不知道git显示这个警告背后的逻辑是什么?显然,我可以看到这两个场景,并注意到它们给出了不同的结果。但我不知道git想要什么来抛出这个警告


    有人能给我解释一下这一点吗?这是如何解释我在类路径文件中看到的警告的?

    每次您签出到另一个分支时,它都会重置工作树以匹配该新分支的索引。并将索引设置为新的分支头

    如果重置涉及修改(跟踪)的文件,签出将中止,并显示警告

    第一个场景从现有分支创建一个分支:其索引将与现有分支相同(包括当前修改)因为头不移动(新分支的头与以前的头相同):您可以切换到它,而无需重置任何内容:工作树不变


    第二个场景涉及两个不同分支的两个不同索引和两个不同的头:如果不保存或提交当前分支的更改,则无法切换到一个索引,因为签出需要将工作树重置为另一个分支内容(头),这将丢弃(并丢失)您的更改。

    基本上,问题是如果您尝试切换分支(这是git checkout X正在做的),并且目标分支(
    X
    在本例中)对您也在本地修改但尚未提交的文件进行了更改,则本地更改可能会被覆盖

    请记住:更改分支时,工作树中的文件会更改以反映新索引


    因此,如果您修改了一个需要更改以匹配目标索引的文件,您的更改将被覆盖,因此签出将中止。

    @Thor yes,我的观点是,当您切换分支时,签出会将工作树重置为新分支的索引。该索引被设置为新的分支头。所以被修改的文件将被覆盖以匹配分支头(带有反映该分支头的索引)。让我这样问,在第二个场景中,在签出时,我们在索引中没有任何内容,一个被跟踪的未提交文件(在master中),在索引中没有任何内容,在(X branch)的工作树中有一个文件。Head is branch在master中比Head早一个。那么,当我git checkout X时,什么被重置为什么,什么导致了警告?谢谢您的帮助。@Thor当您签出(第二个场景)时,您的更改将丢失,因为跟踪的修改文件将重置为第二个分支的标题内容。