我正在尝试从远程分支更新我的repo并在我执行“git pull”时不断收到此错误。我没有做过任何局部更改,即使我有,我也不需要保留它们。
我试过了:
git reset --hard
我遇到了同样的问题
唯一可行的方法是删除有问题的文件并再次尝试git pull。
我还尝试了git stash
后跟git pull
。不行。
编辑:使用PortableGit-1.6.4-preview20090729,因此任何以前的虚假错误都应该修复。
答案 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 status
说new file: foo.cpp
并将文件 not 添加到登台区域的情况下,我遇到了同样的错误。即在“未针对提交进行的更改”标题下。很奇怪,这种情况通常不会发生。
解决方案:git add foo.cpp
,然后git stash
重新工作。
答案 10 :(得分:0)
我正在尝试执行git merge --abort。 git restore your_file命令为我解决了这个问题