Git pull:错误:条目foo不是最新的。无法合并


86

我正在尝试从远程分支更新我的仓库,并在执行“ git pull”时不断出现此错误。我没有进行任何本地更改,即使我进行了更改,也不需要保留它们。

我试过了:

git reset --hard

我遇到了同样的问题

似乎唯一可行的方法是删除有问题的文件,然后再次尝试git pull。

我也试过git stashgit pull。不行

编辑:使用PortableGit-1.6.4-preview20090729,以便修复以前任何带有虚假错误的错误。



同上“似乎唯一可行的方法是删除有问题的文件,然后再次尝试git pull。 ”。对我来说,至少一个文件不在git中;通配符规则忽略了它。不过,不确定为什么他们会成为阻碍者。
ruffin

3
我能够通过运行来解决此问题git rm --cached learned/tests/temp_funcs.py-由于我始终希望文件保留在git rm --cached跟踪的文件”列表中,因此在这种情况下,请解除阻止。
深夜

1
在我希望合并的过程中,这发生在我身上--abort。除了删除有问题的文件外,所有建议的解决方案都不允许我中止。
Trevor Reid

Answers:


55

有两种方法可以解决此问题,但是我发现git stash对我有用。它暂时将您的本地更改放到另一个地方。然后,您可以拉动以获取最新的更改。然后您可以取回本地更改。

像这样:

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

$ git stash
$ git pull
$ git stash pop

20
从最初的问题开始:“我也尝试过“ git stash”,然后再进行“ git pull”。不行。”
查尔斯·伍德

不适用于我-就我而言,我必须做git rm --cached完整评论:stackoverflow.com/questions/1248029/…–
深夜

37

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

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 

然后一切应该恢复正常。


1
我能够通过运行来解决此问题git rm --cached learned/tests/temp_funcs.py-由于我始终希望文件保留在git rm --cached跟踪的文件”列表中,因此在这种情况下,请解除阻止。
深夜

3
git update-index --really-refresh是一件遗失!做得好,这很难找到
Bernardo Dal Corno

28

这类问题通常是由于尝试从具有两个仅大小写不同的文件名的存储库中提取而引起的。如果您使用的是FAT,不区分大小写模式下的NTFS(实际上是在Windows下任何时候使用它)或不区分大小写模式的HFS +,并且有两个文件“ foobar”和“ FOOBAR”,那么Git将看到两个不同的文件文件,但文件系统只会看到一个,这将导致各种问题。Git将先检出“ FOOBAR”,然后检出“ foobar”,文件系统将其视为简单地替换了“ FOOBAR”的内容,但将其保留在原位。现在到Git,看来“ FOOBAR”已替换为“ foobar”的内容,“ foobar”消失了。

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

您可以解决的另一种情况是,重命名发生时更改了文件的大小写。例如,假设Git存储库包含从“ EXAMPLE”到“ example”的重命名。在Git签出新版本之前,它将尝试检查以确保它不会覆盖磁盘上已有的某些现有文件。由于它认为“ example”是新文件名,因此它将询问文件系统是否存在,并且文件系统将看到“ EXAMPLE”并说“是”,因此Git会拒绝签出新版本,因为它认为它将被覆盖未跟踪的文件。在这种情况下,如果您没有关心的本地更改,则简单git reset --hard <revision-to-checkout>通常足以使您克服问题并适应新的修订要求。只是要记住不要将文件重命名为仅在不区分大小写的文件系统上使用的大小写不同的其他名称,因为这会引起类似的问题。


14

要进一步详细说明@Brian Campbell的帖子(因为也很难进行重置),我想指出一个阻碍我前进的极端情况。

我已经将文件移到另一个文件OldFile夹并重命名了NewFile。然后,我将该文件标记为assume-unchanged

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


1
谢谢,这个答案使我走上了正轨。我使用了“ git ls-files -v | grep'^ [[:: lower:]]'| awk'{print $ 2}'| xargs git update-index --no-assume-unchanged”来重置假设不变的标志,那么我就能重设--hard且没有错误。
ocroquette

我认为这也适用于任何标记为“假定不变”的文件,因为忽略了对具有其原始名称的本地文件的更改,我遇到了同样的问题。您的评论提醒我,我已标记该文件,谢谢!
Jake_

5
我也有同样的问题。基本上,“假定不变”是一个邪恶的特征。一旦使用它,就很难结帐其他分支。即使使用checkout -f,它也会失败。
约翰·汉克

13

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


11
来自以下问题:“我尚未进行任何本地更改...”
Charles Wood

这是一个git错误或它是git存储库损坏。
沃伦·P

11

我遇到了类似的问题(Windows 10):我在打开branchA并想转到master。我有一些未提交的更改所以首先我git stash然后git checkout -f master,但我还是得到了Entry 'fileName' not uptodate. Cannot merge

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

最终,我只是手动删除了文件,并且能够转到另一个分支(这当然使我的文件回来了),所以我猜git中某个地方存在错误。


1
这是对我有用的唯一解决方案。我收到.gitignore文件错误!即使我没有对其进行任何更改,并且git也不允许我“存储”它(因为没有本地更改,,!)。因此,我将.gitignore文件移出了存储库(作为一种“备份”),然后执行git reset --hard,将存储库“修复”为正常状态。
蒙面侠

git status向我显示了哪个文件已更改,并提示我可以使用git restore myFile而不是删除它来工作。
Noumenon

7

文件权限也可能有问题。Git也会对它们进行版本控制,除非config另有说明。只需为几乎有类似问题的人添加此答案即可。


5

值得一试:

您能否仅为此更新设置config参数core.trustctime为false?

core.trustctime

如果为false,则索引和工作副本之间的ctime差异将被忽略;否则为false。当Init更改时间由Git外部的某些文件(文件系统搜寻器和某些备份系统)定期修改时很有用。


2
很好的发现,当我在运行“ git reset --merge”时看到上面的错误消息时,这实际上对我有用。当我将此参数设置为false时,它摆脱了错误。
DemitryT

1
在使用“ git merge <功能> --no-ff --no-commit”检查与另一个分支的冲突时为我工作,然后使用“ git merge --abort”还原。在这种情况下,Xcode是“ Git之外的东西”。感谢近十年后!
拉尔方索

@Ralfonso将近十年后,我们深受欢迎:)
VonC

2

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


0

我有同样的错误,一种情况后git status说,new file: foo.cpp一个文件加入临时区域。即在“未上演提交的更改”标题下。很奇怪,这种情况通常不会发生。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.