致命错误:git-write-tree:构建树时出错

230

我从一个共享的git仓库进行了git pull,但情况出现了很大问题,之后我尝试了git revert。现在的情况是这样的:

$ git stash
Source/MediaStorageAndFileFormat/gdcmImageCodec.cxx: needs merge
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx: needs merge
Source/MediaStorageAndFileFormat/gdcmPNMCodec.cxx: needs merge
Testing/Source/DataStructureAndEncodingDefinition/Cxx/TestDS.cxx: needs merge
Utilities/socketxx/socket++/sockstream.cpp: needs merge
Source/MediaStorageAndFileFormat/gdcmImageCodec.cxx: needs merge
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx: needs merge
Source/MediaStorageAndFileFormat/gdcmPNMCodec.cxx: needs merge
Testing/Source/DataStructureAndEncodingDefinition/Cxx/TestDS.cxx: needs merge
Utilities/socketxx/socket++/sockstream.cpp: needs merge
Source/MediaStorageAndFileFormat/gdcmImageCodec.cxx: unmerged (2aafac967c35fa4e77c3086b83a3c102939ad168)
Source/MediaStorageAndFileFormat/gdcmImageCodec.cxx: unmerged (78cc95e8bae85bf8345a7793676e878e83df167b)
Source/MediaStorageAndFileFormat/gdcmImageCodec.cxx: unmerged (2524db713fbde0d7ebd86bfe2afc4b4d7d48db33)
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx: unmerged (4bb4ba78973091eaa854b03c6ce24e8f4af9e7cc)
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx: unmerged (ad0982b8b8b4c4fef23e69bbb639ca6d0cd98dd8)
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx: unmerged (4868371b7218c6e007fb6c582ad4ab226167a80a)
Source/MediaStorageAndFileFormat/gdcmPNMCodec.cxx: unmerged (f7a1b386b5b13b8fa8b6a31ce1258d2d5e5b13c5)
Source/MediaStorageAndFileFormat/gdcmPNMCodec.cxx: unmerged (6ce299c416fbb3bb60e11ef1e54962ffd3449a4c)
Source/MediaStorageAndFileFormat/gdcmPNMCodec.cxx: unmerged (75c8043a60a56a1130a34cdbd91d130bc9343c1c)
Testing/Source/DataStructureAndEncodingDefinition/Cxx/TestDS.cxx: unmerged (79c2843f2649ea9c87fa57662dafd899a5fa39ee)
...
fatal: git-write-tree: error building trees
Cannot save the current index state

有没有一种方法可以重置所有内容?

谢谢

7个回答

608

使用

git reset --mixed

使用git switch --detach代替git reset --hard。您不会失去任何更改。


30
请注意,当git reset没有给定参数时,--mixed参数也是其默认行为。参考manpage - Christopher
65
回答正确,但最好能够解释发生了什么以及为什么这是必要的。 - mmigdol
1
@mmigdol 是的 - 我想看到一个解释为什么在这种情况下使用(默认)--mixed选项的git reset是适当且有效的。根据merge - Git unmerged path issue: ** 这将切换到HEAD,并告诉git忘记任何合并冲突,并将工作目录保持不变。** heracek,这就是正在发生的事情吗? - nealmcb
无法工作。我得到了 git: 'reset--mixed' 不是 git 命令。请参阅 'git --help'。 - writofmandamus
1
@writofmandamus 几个月晚了,但请注意reset和连字符之间的空格。 - Mike Ortiz
3
我遇到了一个问题,当我使用git stash命令时发生了这个问题。执行git reset --mixed命令解决了它。 - mfaani

56
这对我很有效:
做:
$ git status

检查是否有未合并的路径(Unmerged paths)

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#   both modified:      app/assets/images/logo.png
#   both modified:      app/models/laundry.rb

将它们修复并用git add将它们添加到暂存区,然后再次尝试git stash

git add app/assets/images/logo.png

7
这对我很有效。git reset --mixed可能比世界和平更好,但如果没有解释它的作用,我是不会碰它的。在我的情况下,早期拉取中发生了冲突,但我没有注意到。由于未解决的拉取,存储失败了。 - Ian Ollmann
1
我对这种策略的理解并不比 git reset --mixed 更好,但它确实起作用了,并且似乎更适合我的情况,因为我在 git stash 而不是 git revert 之后出现了错误。 - Mars
一个未合并的路径意味着你已经运行了git merge或者等效的git merge命令,它试图将两个不同的文件变更集合合并到该文件中,但是失败了。 - siddhantsomani
这对我也起作用了,在尝试执行git stash之后。我必须先执行git add <file>,然后才能成功地进行存储。 - Aquarelle

11

跟进 malat 的回答,你可以通过创建补丁并在以后重新应用它来避免丢失更改。

git diff --no-prefix > patch.txt
patch -p0 < patch.txt

为了安全起见,将您的补丁存储在存储库文件夹之外。


这个命令给了我:SDGL132d9f4b4:glitch-common dstromberg$ patch -p0 < /tmp/patch.txt 补丁程序:****在补丁输入中只发现了垃圾。 - dstromberg
我认为你应该将补丁文件 mv 回到创建它的目录中。步骤如下:1. 运行 git diff 命令;2. 将补丁文件移动到 /tmp 目录下;3. 运行 git stash 命令;4. 将 /tmp/patch.txt 文件移回当前目录;5. 运行 patch -p0 命令。 - yunzen

10

我使用了:

 git reset --hard

我丢失了一些更改,但这没关系。


7
仅做说明:git revert 尝试合并过去的更改;你已经正确使用了 git reset 来简单地倒回时间。遗憾的是,git stash 不能处理合并冲突。 - Josh Lee
2
如果你丢失了更改,这不是一个修复 ;) - Pedro Magalhães

5
也许在您的 Git 存储库中有一些未合并的路径,您需要在隐藏之前解决这些问题。

1
这对我很有帮助,所以我会点个赞。但是我会提供一个更详细的答案。 - David Rz Ayala

0

当我尝试合并另一个分支时,发生了这种情况。合并失败,并显示错误信息:fatal: git-write-tree: error building trees,并抱怨与合并无关的不同文件。然后,我的分支包含了它尝试合并的文件,作为未提交的更改。

我清除了它尝试合并的更改,然后删除了问题文件并重建了哈希:

git reset --hard;

git rm --cache problem_file.txt;

git hash-object -w problem_file.txt;

合并就成功了。


-1

这种情况发生在我试图隐藏我的更改时,但是我的更改与我的分支的当前状态存在冲突

所以我使用git reset --mixed,然后解决了 Git 冲突,再次隐藏变更。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接