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

malat
fuente

Respuestas:

566

Utilizar:

git reset --mixed

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

heracek
fuente
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
David Rz Ayala
fuente
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.

afilina
fuente
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.

malat
fuente
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.

npeters
fuente
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.

Miel
fuente