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

yui*_*uit 66 git

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

我试过了:

git reset --hard
Run Code Online (Sandbox Code Playgroud)

而且我遇到了同样的问题

唯一似乎有效的是删除有问题的文件并再次尝试git pull.

我也试过git stash跟着一个git pull.不行.

编辑:使用PortableGit-1.6.4-preview20090729,所以任何以前的错误都应该修复.

man*_*nat 55

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

像这样:

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

$ git stash
$ git pull
$ git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 从最初的问题:_"我也试过"git stash",然后是"git pull".不行."_ (10认同)
  • @yuit:如果这解决了你,你应该接受这个答案 (2认同)
  • 不适合我 - 就我而言,我必须“git rm --cached”,完整评论:/sf/ask/87362061/无法合并#comment100131900_1248029 (2认同)
  • 对我来说,当我尝试使用“git stash”时会发生错误。 (2认同)

Bri*_*ell 26

这种问题通常是由于尝试从具有两个仅在大小写上不同的文件名的存储库中提取而引起的.如果您使用的是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>通常只需要一个简单的操作即可让您解决问题和新版本.只是尝试并记住不要将文件重命名为其他名称,只有在不区分大小写的文件系统的情况下,因为它会导致这样的问题.


hab*_*ats 19

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

git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

然后例如结帐一些其他分支:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.
Run Code Online (Sandbox Code Playgroud)

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

git update-index --really-refresh
<file>: needs update
Run Code Online (Sandbox Code Playgroud)

其次是:

git reset --hard 
Run Code Online (Sandbox Code Playgroud)

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

  • 我能够通过运行 `git rm --cached learn/tests/temp_funcs.py` 来解决这个问题 - 因为我无论如何都希望文件保留在 *Untracked Files* 列表中,所以 `git rm --cached` 在这种情况下解锁了我。 (5认同)
  • “git update-index --really-refresh”是缺失的部分!干得好,这个很难找到 (5认同)

cod*_*ate 12

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

  • 从问题:_"我没有做任何局部变化......"_ (5认同)

Agg*_*sor 10

为了进一步详细说明@Brian Campbell的帖子(因为重置难以发挥作用)我想指出一个阻止我的边缘案例.

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

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

  • 我也有同样的问题.基本上"假设不变"是一个邪恶的特征.一旦你使用它,它很难检查其他分支机构.即使你使用`checkout -f`,它也会失败. (3认同)

Dra*_*els 7

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


use*_*648 7

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

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

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


Von*_*onC 5

值得一试:

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

core.trustctime
Run Code Online (Sandbox Code Playgroud)

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

  • 不错的发现,当我在运行“git reset --merge”时看到上面的错误消息时,这实际上对我有用。当我将此参数设置为 false 时,它​​消除了错误。 (2认同)