fatal: git-write-tree: error al construir árboles


202

Hice un git pulldesde un repositorio de git compartido, pero algo salió realmente mal, después de probar a git revert. Aquí está la situación ahora:

$ 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

¿Hay alguna manera de restablecer todo eso?

Gracias

Respuestas:


566

Utilizar:

git reset --mixed

en lugar de git reset --hard. No perderás ningún cambio.


29
Tenga en cuenta que el --mixedargumento también git resetes el comportamiento predeterminado, cuando no se le da un argumento. página de manual para referencia.
Christopher

62
Respuesta válida, pero sería bueno tener una explicación de lo que sucedió y por qué fue necesario.
mmigdol

1
@mmigdol Sí, me gustaría ver una explicación de por qué git resetcon la --mixedopción (predeterminada) es apropiado y efectivo aquí también. De acuerdo con merge : problema de ruta no fusionada de Git : esto cambiará a HEAD y le dirá a git que olvide cualquier conflicto de fusión y dejará el directorio de trabajo tal como está. Heracek, ¿es eso lo que está pasando?
nealmcb

1
@writofmandamus Meses tarde, pero tenga en cuenta el espacio entre el reinicio y los guiones.
Mike Ortiz

2
FWIW Me encontré con este problema cuando estaba haciendo git stash. Haciéndolo lo git reset --mixedresolvió.
Miel

45

Esto funcionó para mí:

Hacer

$ git status

Y verifica si tienes 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

Fíjelos con git addcada uno de ellos e intente git stashnuevamente.

git add app/assets/images/logo.png

66
Esto funcionó para mí. git reset: mixto puede ser mejor que la paz mundial, pero sin alguna explicación de lo que hace, no lo estoy tocando. En mi caso, hubo una colisión en un tirón anterior que no noté. El alijo falló debido al tirón no resuelto.
Ian Ollmann el

No entiendo esta estrategia mejor que git reset --mixed, pero funcionó, y parecía ser una mejor opción para mi caso porque recibí el error en git stashlugar de hacerlo git revert.
Marte

Una ruta no combinada significa que ha ejecutado git merge, o el equivalente de git merge, e intentó fusionar dos conjuntos diferentes de cambios en ese archivo, pero falló.
siddhantsomani

11

Para hacer un seguimiento de la respuesta de malat, puede evitar perder los cambios creando un parche y volver a aplicarlo más adelante.

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

Almacene su parche fuera de la carpeta del repositorio por seguridad.


Esto me dio: SDGL132d9f4b4: glitch-common dstromberg $ patch -p0 </tmp/patch.txt patch: **** Solo se encontró basura en la entrada del parche.
dstromberg

Creo que deberías mvvolver a colocar el parche en el directorio donde lo creaste. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen

9

Solía:

 git reset --hard

Perdí algunos cambios, pero esto está bien.


66
Solo una nota: git revertintenta fusionar los cambios del pasado; has usado correctamente git resetpara simplemente rebobinar el reloj. Es lamentable que git stashno funcione con conflictos de fusión.
Josh Lee

2
Si pierde cambios, esto no es una solución;)
Pedro Magalhães

5

tal vez hay algunos caminos no combinados en su repositorio de git que debe resolver antes de guardarlos.


1
Esto me ayudó, así que le daré un +1. Pero pongo una respuesta más extensa.
David Rz Ayala

-1

Esto me sucedió cuando estaba tratando de esconder mis cambios, pero luego mis cambios tuvieron conflictos con el estado actual de mi sucursal.

Así lo hice git reset --mixedy luego resolví el conflicto git y me escondí de nuevo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.