gây tử vong: git-write-tree: lỗi xây dựng cây


202

Tôi đã làm một git pulltừ một kho lưu trữ git được chia sẻ, nhưng một cái gì đó đã thực sự sai, sau khi tôi đã thử a git revert. Đây là tình huống hiện tại:

$ 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

Có cách nào để thiết lập lại tất cả?

Cảm ơn

Câu trả lời:


566

Sử dụng:

git reset --mixed

thay vì git reset --hard. Bạn sẽ không mất bất kỳ thay đổi.


29
Lưu ý rằng --mixedđối số cũng git resetlà hành vi mặc định, khi không được cung cấp đối số. manpage để tham khảo.
Christopher

62
Câu trả lời hợp lệ, nhưng sẽ rất hay để có một lời giải thích cho những gì đã xảy ra và tại sao điều này lại cần thiết.
mmigdol

1
@mmigdol Yeah - Tôi muốn xem giải thích tại sao git resetvới --mixedtùy chọn (mặc định) cũng phù hợp và hiệu quả ở đây. Theo hợp nhất - Vấn đề đường dẫn không được trộn lẫn của Git : Điều này sẽ chuyển sang CHÍNH và thông báo cho git để quên mọi xung đột hợp nhất và để lại thư mục làm việc. heracek, đó là những gì đang xảy ra?
nealmcb

1
@writofmandamus Tháng muộn, nhưng lưu ý khoảng cách giữa thiết lập lại và dấu gạch nối.
Mike Ortiz

2
FWIW Tôi gặp phải vấn đề này khi tôi đang làm git stash. Làm git reset --mixedgiải quyết nó.
Mật ong

45

Điều này làm việc cho tôi:

Làm

$ git status

Và kiểm tra nếu bạn có 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

Sửa chúng với git addtừng cái và thử git stashlại.

git add app/assets/images/logo.png

6
Điều này làm việc cho tôi. git reset - trộn lẫn có thể tốt hơn hòa bình thế giới, nhưng không có lời giải thích nào về những gì nó làm, tôi không chạm vào nó. Trong trường hợp của tôi, đã có một vụ va chạm trong một lần kéo trước đó mà tôi không nhận thấy. Stash thất bại vì sức kéo chưa được giải quyết.
Ian Ollmann

Tôi không hiểu chiến lược này tốt hơn git reset --mixed, nhưng nó hiệu quả và có vẻ phù hợp hơn với trường hợp của tôi vì tôi đã nhận được lỗi sau git stashđó hơn là git revert.
Sao Hỏa

Một Đã hủy phương tiện đường bạn đã chạy git merge, hoặc tương đương với git merge, và nó đã cố gắng để hợp nhất hai bộ khác nhau của thay đổi tập tin đó, nhưng thất bại.
siddhantsomani

11

Để theo dõi phản ứng của malat, bạn có thể tránh mất các thay đổi bằng cách tạo một bản vá và áp dụng lại sau đó.

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

Lưu trữ bản vá của bạn bên ngoài thư mục kho lưu trữ cho an toàn.


Điều này đã cho tôi: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** Chỉ tìm thấy rác trong đầu vào bản vá.
dstromberg

Tôi nghĩ bạn nên mvvá lại vào thư mục nơi bạn đã tạo nó từ đó. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen

9

Tôi đã sử dụng:

 git reset --hard

Tôi đã mất một số thay đổi, nhưng điều này là ok.


6
Chỉ cần một lưu ý: git revertcố gắng hợp nhất các thay đổi từ quá khứ; bạn đã sử dụng chính xác git resetđể đơn giản tua lại đồng hồ. Thật không may là git stashkhông làm việc với các xung đột hợp nhất.
Josh Lee

2
Nếu bạn mất các thay đổi, đây không phải là một sửa chữa;)
Pedro Magalhães

5

có thể có một số đường dẫn không được trộn trong kho git của bạn mà bạn phải giải quyết trước khi bỏ.


1
Điều này đã giúp tôi vì vậy tôi sẽ cho nó +1. Nhưng tôi đặt một câu trả lời mở rộng hơn.
David Rz Ayala

-1

Điều này xảy ra với tôi khi tôi đang cố gắng thay đổi những thay đổi của mình, nhưng sau đó những thay đổi của tôi đã mâu thuẫn với tình trạng hiện tại của chi nhánh.

Vì vậy, tôi đã làm git reset --mixedvà sau đó giải quyết xung đột git và lại bị đâm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.