fatal: git-write-tree: błąd przy budowaniu drzew

202

Zrobiłem git pullze wspólnego repozytorium git, ale coś poszło naprawdę nie tak, po tym jak spróbowałem git revert. Oto sytuacja teraz:

$ 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

Czy istnieje sposób na zresetowanie tego wszystkiego?

Dzięki

malat
źródło

Odpowiedzi:

566

Posługiwać się:

git reset --mixed

zamiast git reset --hard. Nie stracisz żadnych zmian.

heracek
źródło
29
Zauważ, że --mixedargument jest również git resetdomyślnym zachowaniem, gdy nie podano argumentu. strona w celach informacyjnych.
Christopher
62
Prawidłowa odpowiedź, ale byłoby miło wyjaśnić, co się stało i dlaczego było to konieczne.
mmigdol
1
@mmigdol Tak - chciałbym zobaczyć wyjaśnienie, dlaczego opcja git reset(domyślna) --mixedjest tutaj odpowiednia i skuteczna. Według korespondencji seryjnej - problem z połączoną ścieżką Git : spowoduje to przełączenie na HEAD i powie git, aby zapomniał o wszelkich konfliktach scalania, i opuści katalog roboczy bez zmian. heracek, czy o to chodzi?
nealmcb
1
@writofmandamus Miesiące spóźnienia, ale zwróć uwagę na odstęp między resetem a myślnikami.
Mike Ortiz
2
FWIW Natrafiłem na ten problem, kiedy to robiłem git stash. To git reset --mixedrozwiązało.
Kochanie,
45

To działało dla mnie:

Robić

$ git status

I sprawdź, czy masz 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

Napraw je za pomocą git addkażdego z nich i spróbuj git stashponownie.

git add app/assets/images/logo.png
David Rz Ayala
źródło
6
To zadziałało dla mnie. git reset - zmieszany może być lepszy niż pokój na świecie, ale bez jakiegoś wyjaśnienia, co robi, nie dotykam go. W moim przypadku we wcześniejszym pociągnięciu doszło do kolizji, której nie zauważyłem. Skrytka nie powiodła się z powodu nierozwiązanego pociągnięcia.
Ian Ollmann,
Nie rozumiem tej strategii lepszego niż git reset --mixed, ale to działało, i wydawało się, że lepiej pasuje do mojego przypadku, ponieważ mam ten błąd po git stashzamiast git revert.
Mars
An niezłączonych środkiem ścieżki został uruchomiony git merge, lub równowartość git scalania, a starał się połączyć dwa różne zestawy zmian do tego pliku, ale nie powiodło się.
siddhantsomani
11

Aby śledzić reakcję Malata, możesz uniknąć utraty zmian, tworząc łatkę i ponownie ją zastosuj w późniejszym terminie.

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

Dla bezpieczeństwa przechowuj łatkę poza folderem repozytorium.

afilina
źródło
To dało mi: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** Tylko śmieci zostały znalezione na wejściu łatki.
dstromberg,
Myślę, że powinieneś mvponownie zainstalować łatkę w katalogu, z którego ją utworzyłeś. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
Junzen
9

Użyłem:

 git reset --hard

Straciłem kilka zmian, ale to jest w porządku.

malat
źródło
6
Tylko uwaga: git revertpróbuje scalić zmiany z przeszłości; poprawnie użyłeś git resetpo prostu przewinąć zegar. To niefortunne, że git stashnie działa w przypadku konfliktów scalania.
Josh Lee
2
Jeśli stracisz zmiany, to nie jest poprawka;)
Pedro Magalhães,
5

być może w twoim repozytorium git znajdują się niezamieszane ścieżki, które musisz rozwiązać przed schowaniem.

npeters
źródło
1
Pomogło mi to, więc dam +1. Ale podałem bardziej rozszerzoną odpowiedź.
David Rz Ayala
-1

Stało się to dla mnie, gdy próbowałem ukryć moje zmiany, ale potem moje zmiany były w konflikcie z bieżącym stanem mojego oddziału.

Więc zrobiłem, git reset --mixeda potem rozwiązałem konflikt gitów i znów się schowałem.

kochanie
źródło