Git pull: error: 条目 foo 未更新。无法合并

我试图从一个远程分支更新我的回购,并继续得到这个错误,当我做一个“ git 拉”。我没有做任何地方性的改变,即使我做了,我也不需要保留它们。

我试过了:

git reset --hard

我也有同样的问题

The only thing that seems to work is deleting the offending file and try a git pull again.

I've also tried git stash followed by a git pull. No go.

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

97384 次浏览

一般来说,这意味着您的本地文件中有未提交到本地存储库的更改。您还可以更详细地查看这个 堆栈溢出问题

值得一试:

你能为这次更新设置 config parameter core.trustctime为 false 吗?

core.trustctime

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

有几种方法可以解决这个问题,但我发现 Git 藏起来对我很有用。它将您的本地更改暂时放置到另一个位置。然后你可以拉,抓住最新的变化。然后你就可以拿回你的本地变化。

就像这样:

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


$ git stash
$ git pull
$ git stash pop

这种类型的问题通常是由于试图从一个只有两个不同文件名的存储库中提取文件而引起的。如果你使用 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>通常就足以帮助您解决问题并进行新的修订。只要记住不要将文件重命名为其他名称,只有在不区分大小写的文件系统上才会出现这种情况,因为这会导致类似的问题。

It might a problem also with file permissions. Git is versioning them too, unless config says otherwise. Just adding this answer for people who has almost but not the like problem.

对于@Brian Campbell 的帖子的进一步详细说明(因为重置也不起作用) ,我想指出一个阻止我的边缘案例。

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

这阻碍了我转换分支机构,也没有存储空间可以保存或者推送。问题是,在设置 assume-unchanged标志之前,我没有使用新名称提交这个文件更改。所以我将它设置回 no-assume-unchanged,提交它,然后将它设置回 assume-unchanged,我可以再次切换分支。

我看到了一个类似的问题(Windows10) : 我在 branchA上,想转到 master分支。我有一些未提交的更改,所以首先调用 git stash,然后调用 git checkout -f master

不幸的是,我不断收到 Entry 'fileName' not uptodate. Cannot merge错误消息。

命令 git status没有显示要提交的任何更改的信息。

最后,我只需手动删除文件 ,然后就可以转到另一个分支(当然,我的文件又回来了)。我怀疑 Git 存储库中有一个 bug。

如果更新索引以忽略某些文件,则可能出现这种情况:

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

然后例如检查一些其他的分支:

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

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

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

Followed by:

git reset --hard

然后一切都会恢复正常。

加上我的回答,因为其他人都没有提到这一点。在我的示例中,这发生在我将新文件添加到带有 -N标志的索引中之后,因此只需将它们添加到索引中,而不添加其内容。在此状态下,执行 git stash将产生此错误。

我有同样的错误,在这种情况下,git statusnew file: foo.cpp为一个文件 没有添加到暂存区域。即在“未进行提交的更改”标题下。很奇怪,这种事通常不会发生。

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

我正在尝试执行 Git 合并——中止。 Git 恢复 your _ file 命令为我解决了这个问题

Came to this question and none of the answers worked for me, so here's what did it: deleting the file.

rm -rf the_conflicting_file

那么

git checkout your_branch

If git update-index --really-refresh doesn't work, try:

git update-index --no-skip-worktree <file>

在检查另一个分支时,我也得到了同样的错误。 带有错误消息

错误: 输入“ file”未更新。无法合并。

事实证明,问题出在以前从 在当前分支中使用下面的命令建立索引,但是在目标分支中提交了相同的文件。

Git update-index ——略过工作树 foo

因此,修复方法是更新 index 以包含该文件

Git update-index ——无跳过工作树的 foo

and the use git stash or git rm to keep or delete the file.

Nothing here worked for me, in the end I just put my file in a different file path and then put it back, seems to have did the trick.