在git中为多个阶段条目获取致命错误


241

在OS X上将Git版本2.2.0与统一游戏引擎一起使用,并想提交我的代码。我添加了所有内容,但未收到错误消息。然后提交-m,并得到以下错误消息:

fatal: multiple stage entries for merged file 'Assets/Prefabs/Resources'

没注意到我推送的消息,但没有给出错误消息,实际上是说Everything up-to-date 我检查了bitbucket(存放回购的地方),但没有显示我的提交。所以我检查了我的本地日志,也没有显示我的提交。

我已经在Google中寻找答案了……什么也没有。这是什么错误?以及如何解决?


您正在使用哪个版本的git或工具?开发人员列表上最近有一个有关改进多阶段条目检查的主题。news.gmane.org/gmane.comp.version-control.git
Philip Oakley

听起来可能涉及到2.2.0中的额外检查。Jaime Soriano Pastor的8月12日发表的“确保删除未合并的条目”可能是其中的一个话题。
菲利普·奥克利2014年

4
那为什么会这样呢?
查理·帕克

只需对所述文件进行虚拟编辑并“提交并同步”。
sajanyamaha

注意:另请参阅stackoverflow.com/a/51919644/6309
VonC

Answers:


381

Grant最新答案中提到了第一种解决方法,该方法似乎适用于最新版本的Git(2.3 +,Q2 + 2015):

  1. 删除索引

    $ rm .git/index
    
  2. 都加进去

    $ git add -A
    
  3. 承诺

    $ git commit -a
    

原始答案(2014年末)
通常的解决方法是:

  • 再次将远程仓库克隆到新的本地仓库
  • 将第一个仓库中的更改添加到第二个仓库中:

    $ cd /patH/to/second/cloned/repo
    $ git --work-tree=/path/to/first/repo add .
    

您可以在read-cache.c,本补丁中讨论的错误消息中看到此错误消息(“ read-cache.c:确保删除未合并的条目 ”),并在Git 2.2 commit中引入了该错误消息。
由于这是最近的事情,因此 Git 降级到2.1可能足以不受该补丁的影响。

OP丹尼尔Toebe增加的评论

问题发生在我的Macbook上,它决定对我失败,并且另一台计算机的不幸使我在项目上落后了。


@sharpner可能是您的情况的错误或该修补程序的副作用。
VonC 2014年

1
抱歉,延迟的响应...问题发生在我的macbook上,它决定对我失败,另一起计算机故障使我在项目中落后。
Daniel Toebe 2014年

1
@DanielToebe很好的反馈。我将其包含在答案中以提高可见性。
VonC 2014年

在尝试执行以下操作后,我遇到了同样的情况git commit -c sha
克里斯·利什曼

2
对于任何有兴趣的人,这都是我想发生的,因为我不小心在.git文件夹中而不是文件本身中编辑文件。
ostler.c,2016年

166

我相信我遇到了这个问题,因为我添加并提交了更改,然后删除了我刚刚提交的文件。如果这听起来与您的情况类似,建议您遵循以下内容保存重新克隆并手动添加更改。

我可以通过删除存储库中的.git / index文件来解决此问题,类似于@slider建议的设置(我相信他输错了路径)。

rm .git/index

然后,我不得不再次添加并提交我的本地更改

git add -A
git commit -m "..."

然后,我可以进行远程推送。

什么是git索引,它有什么关系?

Git指数有什么关系?

git“索引”是放置要提交到git存储库的文件的位置。

在将文件“提交”(签入)到git存储库之前,您需要首先将文件放入git“索引”中。

我相信,通过删除此文件,git会重新索引该存储库,创建一个新的存储库,您一切顺利。它解决了这个问题,因为在没有删除我引起所有麻烦的文件的情况下,对本地存储库进行了重新索引。

编辑:看来这是与Mac有关(基于注释),所以如果它有帮助,我会通过brew安装OSX 10.10和git版本2.3.4。


1
是的,这很有效,谢谢您的解释。在此之前的一个警告是,隐藏或移动或删除尚未添加当前默认更改列表的任何文件。他们将在git add -A
Kirby

4
在Mac OS X Yosemite上确认。而发生在Android的工作室工作,虽然没有具体的可重复的场景..
德鲁

4
这应该是正确的答案,因为它可以工作并且有更好的解释。这也发生在我身上。
Jared Burrows 2015年

1
也为我工作。在IntelliJ中添加版本控制根使它感到厌烦,但rm git索引工作正常。感谢您的解释@grant。
Andrew Eells,2015年

1
当我在vim中进行一些修改时,当IntelliJ在后台运行时,我也遇到了这个问题。我认为那里有比赛条件git。(实际上,我认为它们很多。)关闭IntelliJ,删除索引,然后重新提交我的工作就很好了。
罗伯特·菲舍尔

119

对于项目

rm .git/index
git reset

删除索引后,您需要通过git reset重新创建它

对于子模块:

转到主项目文件夹

rm .git/modules/your_project_structure/index
git reset --hard HEAD

4
删除索引后的git reset完全钉住了它。谢谢!如果不重置,则每个文件都是索引的新文件,因此必须添加。重置将重建看起来似乎的索引。即使我不明白git如何在没有索引的情况下也可以重建索引?
JosFabre

1
@JosFaber因为索引不是提交历史。实际上,它是“冗余”的辅助结构。请参阅schacon.github.io/gitbook/7_the_git_index.html,这样就可以完全比较工作树和HEAD进行重建。而这正是git reset所做的。手册页说:...将副本条目从<tree-ish>重置为索引...
farincz 2015年

2
谢谢!如果没有重置git,它希望我重新添加存储库中已经存在的所有文件。
罗伯特·伯恩斯坦

1
我在Mac上使用sourcetree。我手动删除了.git / index,然后选择了上次好的提交,单击鼠标右键,然后选择了对此评论进行重置的主菜单(在我的情况下)-然后选择了混合选项,这使我的工作保持良好状态。这样我就可以完成当前工作,现在一切都很好。
user216661 '16

1
最干净,最快的方式!
h4rd4r7c0r3

29

您可以从项目中删除Git索引文件。在项目的根目录中,运行以下命令:

rm .git/index

在那个git之后工作。


3
这不能回答问题。请进一步详细说明该答案。
ArtOfCode 2015年

不适用于我rm: /.git/index: No such file or directoryMac OSX Yosemite;通过自制软件安装的git 2.3.4
授予

@grant您必须在开始时删除斜杠。(rm .git/index在您的git目录中)。
ChristophLSA

2
@ChristophLSA谢谢您-我以描述此操作为清楚起见的方式进行了回答。可以更新此答案以反映正确的路径并告知用户该操作做什么吗?
授予

1
我知道为什么这样。该问题是由损坏的索引引起的。当我在命令行中写入提交消息时通过修改IntelliJ中的代码来破坏索引时,我遇到了这个问题。删除索引不会破坏您的更改,而只是取消暂存它们。
2015年

3

我尝试其他解决方案,它对我有用。以下是我的选择

#cd .git
#rm index
#cd ..
#git add .

正如@farincz所说,您需要通过调用来重新创建索引,git reset否则它将给您fatal: Could not reset index file to revision 'HEAD'
kuskmen,2016年

1

如果这在子模块中发生

索引文件位于父.git目录内:

.git/modules/your_project_structure/index

在子模块中,没有命名的目录.git(至少在我正在处理的项目中),只有一个.git文件告诉您(和git)在哪里寻找该项目的git目录。

Git状态显示我未进行的更改

删除索引文件并执行之后git reset,我发现自己面临许多莫名其妙的更改,并且硬重置无济于事。

警告您将丢失所有更改,因此在继续操作之前,请提交并推送。

索引似乎已损坏,因此我使用以下命令将其删除。

git rm -rf --cached .
git reset --hard HEAD

0

我刚在Github Desktop Client(OSX)上遇到此错误。我所做的就是退出应用程序并重新打开,然后它开始工作。

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.