提交更改后无法切换git分支

问题描述

我正在macOS中从事Xcode项目。该项目也在git版本控制下。我有一个git分支,它是从本地master分支创建的。我已经做了一些实质性的工作,并做出了改变。发出git status命令报告:

nothing to commit,working tree clean

我想切换到master分支并将来自该分支的更改合并到其中。当我转到主分支时,会收到如下响应:

error: Your local changes to the following files would be overwritten by checkout:
    <List of files>
Please commit your changes or stash them before you switch branches.
Aborting

我对为什么文件已更改感到困惑。如果我尝试对其中一个文件进行比较,则不会发生任何事情。没有输出产生。从某种意义上讲,git似乎至少将其中一些文件视为新文件,即使它们不是新文件也是如此。我尝试将应该更改的文件添加到git commit中,但git状态仍然显示

working tree clean

如果我尝试提交,git会说

nothing to commit,working tree clean

如果我尝试执行git stash,它会说

No local changes to save

该如何解决此问题,并允许我将该分支中的更改合并到master分支中?

解决方法

当您要切换到的分支(在您的示例master中)具有您当前分支没有的更改时,就会发生此错误。

如果在尝试切换到新分支时看到此错误,则当前分支可能在一个或多个提交之后。如果是这样,请运行:

git fetch

git fetch实际上仅从远程存储库下载新数据-但不会将任何这些新数据集成到您的工作文件中。取回非常有用,它可以使您远程查看远程存储库中发生的所有事情。 由于它的“无害”性质,您可以放心:获取永远不会操纵,破坏或破坏任何东西。这意味着您永远无法获取足够的时间。

否则,您的另一选择是放弃您当前的分支更改:

git checkout -f master
,

我不确定发生了什么。正如我在对问题的评论中提到的那样,我尝试应用skip-worktree并假设git抱怨的所有文件都未更改,并且这些更改已被分支开关覆盖。我试图做一个分支开关,但它总是失败。

此后,我又执行了一个git status,这一次它显示有两个要提交的 new 文件。这些文件之一是git一直在抱怨分支开关的文件组之一。另一个文件以前从未提到过。关于此状态报告的一个非常令人费解的事情是git将这两个文件都列为 new ,但是它们都已经在存储库中存在了很长一段时间。

我最初取消暂存这些文件是因为我不明白git为什么认为它们是新文件。 git状态然后将它们显示为未跟踪的文件。我再次上​​演了他们,并进行了提交。这产生了令人震惊的输出。数百行内容如下:

delete mode 100644 <some file name>

还有一些

create mode 100644 <some file name>

我担心数据已被删除。我检查了其中一个已删除的模式文件,看起来很好

无论如何,执行了该提交之后,git status指示没有其他待处理的更改,并且在那时,我实际上能够执行分支切换。因此问题似乎已解决。

另一个令人困惑的事情是,在切换分支之后,我尝试使用git ls命令来检查我之前调整过的任何文件是否仍然适用于skip-worktree并且假定未更改,并且没有列出任何文件跳过工作树或假定不变。

如果有人对此有任何解释,那么听听它会很高兴。