фатально: git-write-tree: помилка побудови дерев


202

Я зробив git pullзі спільного сховища git, але щось пішло не так, після того як я спробував 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 : Це переключиться на HEAD, і скаже git забути будь-які конфлікти злиття, а робочий каталог залишить таким, яким він є. Герачек, це те, що відбувається?
nealmcb

1
@writofmandamus Місяці пізно, але зауважте пробіл між скиданням і дефісами.
Майк Ортіз

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 reset - змішаний може бути кращим, ніж світовий мир, але без якихось пояснень того, що він робить, я не торкаюся цього. У моєму випадку сталося зіткнення в більш ранній тязі, яку я не помічав. Стій не вдався через невирішене тягнення.
Ян Оллман

Я не розумію цю стратегію краще git reset --mixed, але вона спрацювала, і здавалася, що краще підходить для мого випадку, тому що я отримав помилку, git stashа не git revert.
Марс

An не об'єднані означає шлях , який ви запустили git merge, або еквівалент мерзотника злиття, і він намагався об'єднати два різних набору змін в цей файл, але не вдалося.
siddhantsomani

11

Щоб продовжити відповідь на Malat, ви можете уникнути втрати змін, створивши виправлення та повторно застосувати його в подальшому.

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

Зберігайте свій патч поза папкою сховища для безпеки.


Це дало мені: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** У вхідному патчі знайдено лише сміття.
dstromberg

Я думаю, вам слід mvзнову повернути патч у каталог, з якого ви його створили. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
юнзен

9

Я використав:

 git reset --hard

Я втратив деякі зміни, але це нормально.


6
Просто примітка: git revertспроби злиття змін із минулим; ви правильно використали git resetпросто перемотування годинника. Прикро, що git stashне працює з конфліктами злиття.
Джош Лі

2
Якщо ви втратите зміни, це не виправлення;)
Педро Магалхес

5

можливо, у вашому сховищі git є кілька неперероблених шляхів, які вам доведеться вирішити перед тим, як зберігати.


1
Це мені допомогло, тому я дам йому +1. Але я поставив більш розгорнуту відповідь.
David Rz Ayala

-1

Це сталося зі мною, коли я намагався приховати свої зміни, але тоді мої зміни суперечили поточному стану моєї філії.

Так я зробив, git reset --mixedа потім вирішив конфлікт git і знову приховав.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.