Git pull:错误:输入foo不是uptodate。无法合并

时间:2009-08-08 05:10:44

标签: git

我正在尝试从远程分支更新我的repo并在我执行“git pull”时不断收到此错误。我没有做过任何局部更改,即使我有,我也不需要保留它们。

我试过了:

git reset --hard

我遇到了同样的问题

唯一可行的方法是删除有问题的文件并再次尝试git pull。

我还尝试了git stash后跟git pull。不行。

编辑:使用PortableGit-1.6.4-preview20090729,因此任何以前的虚假错误都应该修复。

11 个答案:

答案 0 :(得分:54)

有几种方法可以解决这个问题,但我发现git stash对我有用。它暂时将您的本地更改放到另一个地方。然后你可以拉,抓住最新的变化。然后你可以恢复你的本地变化。

就像这样:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

答案 1 :(得分:24)

这种问题通常是由于尝试从具有两个文件名的存储库中提取的,这两个文件名仅在大小写上有所不同。如果您使用的是FAT,NTFS是不区分大小写的模式(基本上,它在Windows下使用的任何时候),或HFS +在不区分大小写的模式下,并且有两个文件“foobar”和“FOOBAR”,那么Git将看到两个不同的文件,但文件系统只会看到一个,这将导致各种问题。 Git会结帐,比如“FOOBAR”,然后结帐“foobar”,文件系统认为只是替换“FOOBAR”的内容,但保留原样。现在对Git来说,似乎“FOBOBAR”已被“foobar”的内容所取代,而“foobar”已经消失。

这个基本问题有两种不同的表现形式。一个是当您的存储库实际包含两个仅在大小写上不同的文件时。在这种情况下,您需要处理区分大小写的文件系统,或者您需要编辑存储库以确保不会发生此类冲突;不区分大小写的文件系统根本无法存储此存储库的内容。

您可以解决的另一种情况是,重命名发生时会更改文件的大小写。例如,假设Git存储库包含从“EXAMPLE”到“example”的重命名。在Git检出新版本之前,它会尝试检查以确保它不会覆盖磁盘上的某些现有文件。因为它认为“example”是一个新的文件名,它会询问文件系统是否存在,文件系统会看到“EXAMPLE”并说是,所以Git会拒绝检查新版本,因为它认为它会被覆盖未跟踪的文件。在这种情况下,如果您没有关注的本地更改,通常只需一个简单的git reset --hard <revision-to-checkout>即可让您解决问题和新版本。只是尝试并记住不要将文件重命名为其他名称,只有在不区分大小写的文件系统的情况下才会有区别,因为它会导致这样的问题。

答案 2 :(得分:13)

一般来说,这意味着您的本地文件中的更改尚未提交到本地存储库。您还可以查看此stackoverflow question以获取更多详细信息。

答案 3 :(得分:10)

为了进一步阐述@Brian Campbell的帖子(因为重置很难也没有工作)我想指出一个阻止我的边缘案例。

我已将文件OldFile移至其他文件夹并重命名为NewFile。然后我将文件标记为assume-unchanged

这阻止我切换分支,没有存储保存或提交推送。问题是我在设置assume-unchanged标志之前没有用新名称提交此文件更改。所以我将其设置回no-assume-unchanged,提交它,然后将其设置回assume-unchanged,我可以再次切换分支。

答案 4 :(得分:10)

如果您更新索引以忽略某些文件,则可能会发生这种情况:

git update-index --assume-unchanged <file>

然后结帐一些其他分支:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

强制索引刷新修复了问题:

git update-index --really-refresh
<file>: needs update

其次是:

git reset --hard 

然后一切都应该恢复正常。

答案 5 :(得分:7)

文件权限也可能存在问题。除非配置另有说明,否则Git也会对它们进行版本控制。只是为几乎但不是类似问题的人添加这个答案。

答案 6 :(得分:5)

我看到了类似的问题(Windows 10):我在branchA并希望转到master。我有一些未经修改的更改,所以我先git stash然后git checkout -f master,但我仍然得到Entry 'fileName' not uptodate. Cannot merge

git status没有显示任何要提交的内容。

最后我手动删除了文件,然后我就可以转到另一个分支(这当然让我的文件回来了)所以我猜git中有一个bug在某处。< / p>

答案 7 :(得分:3)

值得一试:

您是否可以设置,仅针对此更新,将config parameter core.trustctime设置为false?

core.trustctime
  

如果为false,则忽略索引与工作副本之间的ctime差异;当gode(文件系统爬虫和一些备份系统)之外的某些东西定期修改inode更改时间时有用。

答案 8 :(得分:2)

添加我的答案,因为其他人都没有提及。就我而言,这是在我使用-N标志将新文件添加到索引之后发生的,因此仅将它们添加到索引中而不添加其内容。在这种状态下,执行git stash会产生此错误。

答案 9 :(得分:0)

git statusnew file: foo.cpp并将文件 not 添加到登台区域的情况下,我遇到了同样的错误。即在“未针对提交进行的更改”标题下。很奇怪,这种情况通常不会发生。

解决方案:git add foo.cpp,然后git stash重新工作。

答案 10 :(得分:0)

我正在尝试执行git merge --abort。 git restore your_file命令为我解决了这个问题