在这种情况下切换git中的分支时出现“覆盖本地更改”警告的说明?

时间:2014-05-14 08:08:53

标签: git

我几天前克隆了一个存储库并使鳕鱼运行,我需要修改类路径。今天我被告知使用git pull拉出X分支。

现在,当我git checkout X时,我收到了类路径文件的警告

Stash or commit it to prevent local changes from being overwritten.

要重新创建此警告,我在其他项目中尝试了两种方案。

第一个场景

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

第二场景

在另一个回购中,

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

    有人可以向我解释一下这是如何解释我用classpath文件看到的警告的吗?

2 个答案:

答案 0 :(得分:3)

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

如果该重置涉及修改(跟踪)的文件,结帐将中止您看到的警告。

您的第一个场景是从现有场景创建一个分支:它的索引将与现有索引相同(包括当前修改)因为HEAD不移动新的HEAD branch与之前的分支相同):你可以切换到它而不必重置任何东西:工作树没有改变。

你的第二个场景涉及两个不同分支的两个不同索引,它们有两个不同的HEAD:你不能在没有存储或从当前分支提交更改的情况下切换到一个,因为checkout需要将工作树重置为其他分支内容( HEAD),它会丢弃(并丢失)您的更改。

答案 1 :(得分:0)

基本上,问题在于,如果您尝试切换分支(这是git checkout X正在执行的操作),并且目标分支(在这种情况下为X)已对文件进行了更改你还在本地修改但没有提交,可以覆盖本地更改。

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

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