ร้ายแรง: git-write-tree: เกิดข้อผิดพลาดในการสร้างต้นไม้


202

ผม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

มีวิธีรีเซ็ตทั้งหมดไหม?

ขอบคุณ

คำตอบ:


566

ใช้:

git reset --mixed

git reset --hardแทน คุณจะไม่สูญเสียการเปลี่ยนแปลงใด ๆ


29
โปรดทราบว่า--mixedข้อโต้แย้งนี้git resetเป็นพฤติกรรมเริ่มต้นเช่นกันเมื่อไม่ได้รับข้อโต้แย้ง manpageสำหรับการอ้างอิง
คริสโตเฟอร์

62
คำตอบที่ถูกต้อง แต่น่ายินดีที่มีคำอธิบายว่าเกิดอะไรขึ้นและทำไมจึงจำเป็น
mmigdol

1
@mmigdol ใช่ - ฉันต้องการดูคำอธิบายว่าทำไมตัวเลือกgit reset(ค่าเริ่มต้น) --mixedจึงเหมาะสมและมีประสิทธิภาพที่นี่ด้วย ตามการผสาน - Git unmerged path path : สิ่งนี้จะเปลี่ยนไปที่ HEAD และบอกให้ git ลืมความขัดแย้งที่ผสานและออกจากไดเรกทอรีการทำงานตามที่เป็นอยู่ heracek นั่นคือสิ่งที่เกิดขึ้น?
nealmcb

1
@writofmandamus เดือนที่ผ่านมา แต่โปรดสังเกตช่องว่างระหว่างรีเซ็ตและยัติภังค์
Mike Ortiz

2
FWIW git stashฉันวิ่งเข้าไปในปัญหานี้เมื่อผมทำ ทำการgit reset --mixedแก้ไขมัน
ฮันนี่

45

สิ่งนี้ใช้ได้กับฉัน:

ทำ

$ 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

6
สิ่งนี้ใช้ได้สำหรับฉัน การตั้งค่า git - ผสมอาจดีกว่าสันติภาพของโลก แต่ถ้าไม่มีคำอธิบายว่ามันทำอะไรฉันไม่ได้แตะต้องมัน ในกรณีของฉันมีการปะทะกันในการดึงครั้งก่อนซึ่งฉันไม่ได้สังเกต ที่เก็บล้มเหลวเนื่องจากการดึงที่ไม่ได้รับการแก้ไข
Ian Ollmann

ฉันไม่เข้าใจกลยุทธ์นี้ได้ดีกว่าgit reset --mixedแต่ทำงานและดูเหมือนจะเป็นแบบที่ดีขึ้นสำหรับกรณีของฉันเพราะฉันมีข้อผิดพลาดหลังจากที่มากกว่าgit stash git revert
ดาวอังคาร

ผสานรวมเส้นทางหมายความว่าคุณต้องทำงานgit mergeหรือเทียบเท่ากับการผสานคอมไพล์และก็พยายามที่จะรวมสองชุดที่แตกต่างของการเปลี่ยนแปลงไปยังแฟ้มที่ แต่ล้มเหลว
siddhantsomani

11

เพื่อติดตามการตอบสนองของ Malat คุณสามารถหลีกเลี่ยงการสูญเสียการเปลี่ยนแปลงโดยการสร้าง patch และนำไปใช้ใหม่ในภายหลัง

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

จัดเก็บโปรแกรมปะแก้ของคุณนอกโฟลเดอร์ที่เก็บเพื่อความปลอดภัย


สิ่งนี้ให้ฉัน: SDGL132d9f4b4: ความผิดพลาดทั่วไป dstromberg $ patch -p0 </tmp/patch.txt แพทช์: **** มีเพียงขยะเท่านั้นที่พบในอินพุตโปรแกรมแก้ไข
dstromberg

ฉันคิดว่าคุณควรจะmvทำการแก้ไขอีกครั้งในไดเรกทอรีที่คุณสร้างมันขึ้นมา 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen

9

ฉันใช้:

 git reset --hard

ฉันทำการเปลี่ยนแปลงบางอย่างหายไป แต่ก็ไม่เป็นไร


6
แค่ทราบ: git revertพยายามรวมการเปลี่ยนแปลงจากอดีต คุณใช้อย่างถูกต้องgit resetเพียงแค่หมุนกลับนาฬิกา มันเป็นโชคร้ายที่git stashไม่ได้ทำงานกับการรวมความขัดแย้ง
Josh Lee

2
หากคุณสูญเสียการเปลี่ยนแปลงนี่ไม่ใช่การแก้ไข;)
Pedro Magalhães

5

อาจมีบางเส้นทางที่ไม่ได้จมในที่เก็บ git ของคุณที่คุณต้องแก้ไขก่อนที่จะหยุดชะงัก


1
สิ่งนี้ช่วยฉันได้ดังนั้นฉันจะให้ +1 แต่ฉันใส่คำตอบเพิ่มเติม
David Rz Ayala

-1

เรื่องนี้เกิดขึ้นกับฉันเมื่อฉันพยายามซ่อนการเปลี่ยนแปลงของฉัน แต่การเปลี่ยนแปลงของฉันขัดแย้งกับสถานะปัจจุบันของสาขาของฉัน

ดังนั้นฉันgit reset --mixedจึงแก้ไขข้อผิดพลาดของคอมไพล์แล้วหยุดอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.