fatal: git-write-tree: erreur lors de la création d'arbres


202

J'ai fait un à git pullpartir d'un référentiel git partagé, mais quelque chose s'est vraiment mal passé, après avoir essayé un git revert. Voici la situation maintenant:

$ 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

Existe-t-il un moyen de réinitialiser tout cela?

Merci

Réponses:


566

Utilisation:

git reset --mixed

au lieu de git reset --hard. Vous ne perdrez aucun changement.


29
Notez que l' --mixedargument est également git resetle comportement par défaut, lorsqu'il ne reçoit pas d'argument. page de manuel pour référence.
Christopher

62
Réponse valable, mais ce serait bien d'avoir une explication de ce qui s'est passé et pourquoi cela était nécessaire.
mmigdol

1
@mmigdol Ouais - J'aimerais voir une explication des raisons git resetpour lesquelles l' --mixedoption (par défaut) est appropriée et efficace ici aussi. Selon merge - Problème de chemin non fusionné Git : Cela basculera vers HEAD, et dira à git d'oublier tout conflit de fusion, et de laisser le répertoire de travail tel quel. Heracek, c'est ce qui se passe?
nealmcb

1
@writofmandamus Mois en retard, mais notez l'espace entre la réinitialisation et les tirets.
Mike Ortiz

2
FWIW J'ai rencontré ce problème lorsque je le faisais git stash. Faire l'a git reset --mixedrésolu.
Honey

45

Cela a fonctionné pour moi:

Faire

$ git status

Et vérifiez si vous avez 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

Fixez-les git addà chacun d'eux et réessayez git stash.

git add app/assets/images/logo.png

6
Cela a fonctionné pour moi. git reset --mixed peut être meilleur que la paix mondiale, mais sans explication de ce qu'il fait, je n'y touche pas. Dans mon cas, il y a eu une collision lors d'une traction antérieure que je n'ai pas remarquée. La cachette a échoué en raison de l'attraction non résolue.
Ian Ollmann

Je ne comprends pas mieux cette stratégie git reset --mixed, mais cela a fonctionné et semblait être mieux adapté à mon cas, car j'ai eu l'erreur après git stashplutôt que git revert.
Mars

Un chemin non fusionné signifie que vous avez exécuté git merge, ou l'équivalent de la fusion git, et il a essayé de fusionner deux ensembles différents de modifications dans ce fichier, mais a échoué.
siddhantsomani

11

Pour suivre la réponse de malat, vous pouvez éviter de perdre les modifications en créant un patch et en le réappliquant ultérieurement.

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

Stockez votre patch en dehors du dossier du référentiel pour plus de sécurité.


Cela m'a donné: SDGL132d9f4b4: patch glitch-common dstromberg $ patch -p0 </tmp/patch.txt: **** Seules les ordures ont été trouvées dans l'entrée du patch.
dstromberg

Je pense que vous devriez mvremettre le patch dans le répertoire où vous l'avez créé. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen

9

J'ai utilisé:

 git reset --hard

J'ai perdu quelques changements, mais ça va.


6
Juste une note: git reverttente de fusionner les changements du passé; vous avez correctement utilisé git resetpour simplement rembobiner l'horloge. Il est regrettable que git stashcela ne fonctionne pas avec les conflits de fusion.
Josh Lee

2
Si vous perdez des modifications, ce n'est pas un correctif;)
Pedro Magalhães

5

il y a peut-être des chemins non fusionnés dans votre référentiel git que vous devez résoudre avant de les cacher.


1
Cela m'a aidé alors je vais lui donner un +1. Mais j'ai mis une réponse plus étendue.
David Rz Ayala

-1

Cela m'est arrivé lorsque j'essayais de cacher mes modifications, mais mes modifications étaient en conflit avec l'état actuel de ma branche.

Alors j'ai fait git reset --mixedet ensuite résolu le conflit git et j'ai caché à nouveau.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.