【问题标题】:Git pull: error: Entry foo not uptodate. Cannot mergeGit pull:错误:条目 foo 未更新。无法合并
【发布时间】:2010-11-17 21:29:16
【问题描述】:

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

我试过了:

git reset --hard

我遇到了同样的问题

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

我也试过git stash,然后是git pull。不行。

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

【问题讨论】:

  • 看看git.or.cz/gitwiki/GitFaq的解释是否有帮助。
  • 同上“似乎唯一可行的方法是删除有问题的文件并再次尝试 git pull。”。对我来说,至少有一个文件不在 git 中;它被通配符规则忽略了。不过,不知道为什么他们是阻止者。
  • 我可以通过运行 git rm --cached learned/tests/temp_funcs.py 解决这个问题 - 因为我无论如何都希望文件保留在 Untracked Files 列表中,所以 git rm --cached 在这种情况下解除了对我的阻止。
  • 这发生在我希望 --abort 的合并过程中。除了删除有问题的文件外,没有一个建议的解决方案允许我中止。

标签: git


【解决方案1】:

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

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 

然后一切都会恢复正常。

【讨论】:

  • 我可以通过运行 git rm --cached learned/tests/temp_funcs.py 来解决这个问题 - 因为无论如何我都希望文件保留在 Untracked Files 列表中,所以 git rm --cached 在这种情况下解除了对我的阻止。
  • git update-index --really-refresh 是缺失的部分!干得好,这很难找到
【解决方案2】:

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

就像这样:

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

$ git stash
$ git pull
$ git stash pop

【讨论】:

  • 来自原始问题:“我也试过“git stash”,然后是“git pull”。不行。”
  • 对我没用 - 在我的情况下,我必须 git rm --cached,完整评论:stackoverflow.com/questions/1248029/…
  • 对我来说,当我尝试使用 git stash 时会发生错误。
【解决方案3】:

此类问题通常是由于尝试从具有两个仅大小写不同的文件名的存储库中提取而引起的。如果您使用 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 &lt;revision-to-checkout&gt; 通常足以让您解决问题并进入新版本。只要尝试记住不要将文件重命名为其他不同的名称,除非您使用的是不区分大小写的文件系统,否则会导致这样的问题。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 来自问题:“我没有进行任何本地更改...”
    • 这是一个 git bug 或者是 git 存储库损坏。
    【解决方案5】:

    为了进一步详细说明@Brian Campbell 的帖子(因为硬重置也不起作用),我想指出一个阻止我的极端情况。

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

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

    【讨论】:

    • 这个答案让我走上了正轨,谢谢。我使用“git ls-files -v | grep '^[[:lower:]]' | awk '{print $2}' | xargs git update-index --no-assume-unchanged” 来重置假设不变标志,然后我就可以无错误地重置 --hard 了。
    • 我认为这也适用于任何标记为“假定未更改”的文件,我在忽略对具有其原始名称的本地文件的更改时遇到了同样的问题。您的评论提醒我已标记该文件,谢谢!
    • 我也有同样的问题。基本上“假设不变”是一个邪恶的特征。一旦使用它,就很难检查其他分支。即使你使用checkout -f,它也会失败。
    【解决方案6】:

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

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

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

    【讨论】:

    • 这是对我有用的这个问题的唯一解决方案。我收到.gitignore 文件的错误!即使我没有对其进行任何更改,并且 git 也不允许我“隐藏”它(因为没有本地更改,呵呵!)。因此,我将.gitignore 文件移到了存储库之外(作为一种“备份”),然后做了一个git reset --hard,将存储库“修复”为正常状态。
    • git status 向我展示了哪个文件被更改并暗示我可以使用git restore myFile 而不是删除它,这很有效。
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      值得一试:

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

      core.trustctime
      

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

      【讨论】:

      • 很好的发现,当我在运行“git reset --merge”时看到上面的错误消息时,这实际上对我有用。当我将此参数设置为 false 时,它​​消除了错误。
      • 在使用“git merge --no-ff --no-commit”检查与另一个分支的冲突然后使用“git merge --abort”恢复时为我工作。在这种情况下,Xcode 是“Git 之外的东西”。感谢将近 10 年后!
      • @Ralfonso 近十年后,不客气 :)
      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

        我试图执行 git merge --abort。 命令 git restore your_file 已经为我解决了这个问题

        【讨论】:

          【解决方案11】:

          我遇到了同样的错误,在git statusnew file: foo.cpp 的文件没有添加到暂存区之后。即在“未暂存提交的更改”标题下。很奇怪,这通常不会发生。

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

          【讨论】:

            【解决方案12】:

            来到这个问题,但没有一个答案对我有用,所以它是这样做的:删除文件。

            rm -rf the_conflicting_file

            然后

            git checkout your_branch

            【讨论】:

              猜你喜欢
              • 2012-04-21
              • 1970-01-01
              • 2016-09-06
              • 2012-12-15
              • 2019-11-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多