fatal: git-write-tree: erro ao criar árvores

202

Eu fiz a git pullpartir de um repositório git compartilhado, mas algo deu muito errado, depois que tentei a git revert. Aqui está a situação agora:

$ 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 uma maneira de redefinir tudo isso?

obrigado

malat
fonte

Respostas:

566

Usar:

git reset --mixed

em vez de git reset --hard. Você não perderá nenhuma alteração.

Heracek
fonte
29
Observe que o --mixedargumento também git reseté o comportamento padrão, quando não recebe um argumento. manual para referência.
Christopher
62
Resposta válida, mas seria bom ter uma explicação para o que aconteceu e por que isso era necessário.
mmigdol
1
@mmigdol Sim - eu gostaria de ver uma explicação do porquê, git resetcom a --mixedopção (padrão), é apropriada e eficaz aqui também. De acordo com o merge - problema de caminho não imerso do Git : Isso mudará para HEAD, e informará ao git para esquecer qualquer conflito de mesclagem e deixar o diretório de trabalho como está. Heracek, é isso que está acontecendo?
Nealmcb 17/07/19
1
@writofmandamus Meses atrasado, mas observe o espaço entre a redefinição e os hífens.
Mike Ortiz
2
FWIW Encontrei esse problema quando estava trabalhando git stash. Fazendo git reset --mixedresolvido.
mel
45

Isso funcionou para mim:

Faz

$ git status

E verifique se você tem 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

Prenda-os git adda cada um deles e tente git stashnovamente.

git add app/assets/images/logo.png
David Rz Ayala
fonte
6
Isso funcionou para mim. git reset --mixed pode ser melhor que a paz mundial, mas sem alguma explicação do que faz, não estou tocando. No meu caso, houve uma colisão em uma atração anterior que eu não percebi. O estoque falhou devido à atração não resolvida.
111116 Ian Ianmann
Eu não entendo essa estratégia melhor do que git reset --mixed, mas funcionou, e parecia um ajuste melhor para o meu caso porque eu tenho o erro depois de git stash, em vez de git revert.
Mars
Um caminho não mesclado significa que você executou git merge, ou o equivalente ao git merge, e tentou mesclar dois conjuntos diferentes de alterações nesse arquivo, mas falhou.
siddhantsomani
11

Para acompanhar a resposta do malat, você pode evitar a perda de alterações criando um patch e reaplicá-lo posteriormente.

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

Armazene seu patch fora da pasta do repositório por segurança.

afilina
fonte
Isso me deu: SDGL132d9f4b4: dstromberg glitch-common $ patch -p0 </tmp/patch.txt patch: **** Somente lixo foi encontrado na entrada do patch.
Dstromberg 07/04
Eu acho que você deve mvvoltar o patch para o diretório de onde você o criou. 1. git diff2. mv patch.txt /tmp3. git stash4. mv /tmp/patch.txt .5.patch -p0
yunzen 16/06/16
9

Eu usei:

 git reset --hard

Perdi algumas mudanças, mas tudo bem.

malat
fonte
6
Apenas uma observação: git reverttentativas de mesclar mudanças do passado; você usou corretamente git resetpara simplesmente retroceder o relógio. É lamentável que git stashnão funcione com conflitos de mesclagem.
Josh Lee
2
Se você perder as alterações, esta não é uma solução;)
Pedro Magalhães
5

talvez haja alguns caminhos não imersos em seu repositório git que você precise resolver antes de guardar.

npeters
fonte
1
Isso me ajudou, então eu darei um +1. Mas eu coloquei uma resposta mais extensa.
David Rz Ayala 28/03
-1

Isso aconteceu comigo quando eu estava tentando ocultar minhas alterações, mas então elas tiveram conflitos com o estado atual da minha ramificação.

Então git reset --mixed, resolvi o conflito do git e me escondi novamente.

Mel
fonte