роковое: 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. Вы не потеряете никаких изменений.

heracek
источник
29
Обратите внимание, что --mixedаргумент также является git resetповедением по умолчанию, если аргумент не указан. Справочная страница для справки.
Кристофер
62
Правильный ответ, но было бы неплохо получить объяснение того, что произошло и почему это было необходимо.
Мигдол
1
@mmigdol Да - я хотел бы увидеть объяснение того, почему опция git reset(по умолчанию) также --mixedподходит и эффективна здесь. Согласно слиянию - Git unmerged path проблема : это переключится на HEAD и скажет git забыть о любых конфликтах слияния и оставить рабочий каталог как есть. Heracek, это то, что происходит?
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 --mixed может быть лучше, чем мир во всем мире, но без какого-либо объяснения того, что он делает, я не касаюсь этого. В моем случае, было раннее столкновение, которое я не заметил. Копить не удалось из-за нерешенной тяги.
Ян Оллманн
Я не понимаю эту стратегию лучше, чем она git reset --mixed, но она сработала и показалась мне более подходящей для моего случая, потому что я получил ошибку после, git stashа не git revert.
Марс
необъединенные означает путь , который вы запустили git merge, или эквивалент мерзавца слияния, и он пытался объединить два разных набора изменений в этот файл, но не удалось.
siddhantsomani
11

Чтобы следить за реакцией Малата, вы можете избежать потери изменений, создав патч и применив его позже.

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

Храните ваш патч вне папки репозитория для безопасности.

afilina
источник
Это дало мне: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** Во входных данных патча был обнаружен только мусор.
Дстромберг
Я думаю, вам следует 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-репозитории есть несколько незакрепленных путей, которые вы должны решить, прежде чем копировать.

npeters
источник
1
Это помогло мне, поэтому я дам ему +1. Но я поставил более расширенный ответ.
Дэвид Рз Айала
-1

Это произошло для меня, когда я пытался скрыть свои изменения, но затем мои изменения вступили в конфликт с текущим состоянием моей ветви.

Я так git reset --mixedи сделал, а затем решил конфликт с git и снова спрятал.

Мед
источник