fatale: git-write-tree: errore nella costruzione degli alberi


202

Ho fatto un git pullda un repository git condiviso, ma qualcosa è andato storto dopo aver provato a git revert. Ecco la situazione ora:

$ 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'è un modo per ripristinare tutto ciò?

Grazie

Risposte:


566

Uso:

git reset --mixed

invece di git reset --hard. Non perderai alcuna modifica.


29
Si noti che l' --mixedargomento è anche git resetil comportamento predefinito, quando non viene fornito un argomento. manpage di riferimento.
Christopher,

62
Risposta valida, ma sarebbe bello avere una spiegazione per quello che è successo e perché questo era necessario.
mmigdol,

1
@mmigdol Sì - Vorrei vedere una spiegazione del perché git resetcon l' --mixedopzione (predefinita) sia appropriata ed efficace anche qui. Secondo merge - Problema di percorso non unito di Git : questo passerà a HEAD, e dirà a git di dimenticare qualsiasi conflitto di unione e di lasciare la directory di lavoro così com'è. heracek, è quello che sta succedendo?
nealmcb,

1
@writofmandamus Mesi in ritardo, ma nota lo spazio tra reset e trattini.
Mike Ortiz,

2
FWIW Mi sono imbattuto in questo problema mentre stavo facendo git stash. Farlo git reset --mixedrisolto.
Miele

45

Questo ha funzionato per me:

Fare

$ git status

E controlla se hai 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

Risolvili con git addciascuno di essi e riprova git stash.

git add app/assets/images/logo.png

6
Questo ha funzionato per me. git reset - il mix può essere migliore della pace nel mondo, ma senza una spiegazione di ciò che fa, non lo tocco. Nel mio caso, c'è stata una collisione in un pull precedente che non avevo notato. La scorta non è riuscita a causa della forza irrisolta.
Ian Ollmann,

Non capisco questa strategia meglio di git reset --mixed, ma ha funzionato e mi è sembrata una soluzione migliore per il mio caso perché ho ricevuto l'errore dopo git stashpiuttosto che git revert.
Marte,

Un non unite mezzi di percorso è stato eseguito git merge, o l'equivalente di fusione git, ed è cercato di fondere due diverse serie di modifiche a tale file, ma non è riuscito.
siddhantsomani,

11

Per dare seguito alla risposta di Malat, puoi evitare di perdere le modifiche creando una patch e riapplicandola in un secondo momento.

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

Conservare la patch fuori dalla cartella del repository per sicurezza.


Questo mi ha dato: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** È stato trovato solo immondizia nell'input della patch.
dstromberg,

Penso che dovresti mvtornare di nuovo alla patch nella directory da cui l'hai creata. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen

9

Ero solito:

 git reset --hard

Ho perso alcune modifiche, ma va bene.


6
Solo una nota: git reverttenta di unire i cambiamenti del passato; hai usato correttamente git resetsemplicemente per riavvolgere l'orologio. È un peccato che git stashnon funzioni con i conflitti di unione.
Josh Lee,

2
Se perdi le modifiche, questa non è una soluzione;)
Pedro Magalhães il

5

forse ci sono alcuni percorsi non uniti nel tuo repository git che devi risolvere prima di riporlo.


1
Questo mi ha aiutato, quindi gli darò un +1. Ma ho messo una risposta più estesa.
David Rz Ayala,

-1

Questo è successo per me quando stavo cercando di nascondere i miei cambiamenti, ma poi i miei cambiamenti hanno avuto conflitti con lo stato attuale del mio ramo.

Così ho fatto git reset --mixede poi risolto il conflitto git e riposto di nuovo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.