Saya baru saja mengalami ini - mesin saya mogok saat menulis ke repo Git, dan menjadi rusak. Saya memperbaikinya sebagai berikut.
Saya mulai dengan melihat berapa banyak komit yang belum saya mendorong ke repo jarak jauh, dengan demikian:
gitk &
Jika Anda tidak menggunakan alat ini sangat berguna - tersedia di semua sistem operasi sejauh yang saya tahu. Ini menunjukkan bahwa remote saya kehilangan dua komit. Oleh karena itu saya mengklik label yang menunjukkan komit jarak jauh terbaru (biasanya ini akan /remotes/origin/master
) untuk mendapatkan hash (hash panjangnya 40 karakter, tetapi untuk singkatnya saya menggunakan 10 di sini - ini biasanya tetap berfungsi).
Ini dia:
14c0fcc9b3
Saya kemudian klik pada komit berikut (yaitu yang pertama yang tidak dimiliki remote) dan mendapatkan hash di sana:
04d44c3298
Saya kemudian menggunakan keduanya untuk membuat patch untuk komit ini:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Saya kemudian melakukan hal yang sama dengan komit yang hilang lainnya, yaitu saya menggunakan hash dari commit sebelumnya dan hash dari commit itu sendiri:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Saya kemudian pindah ke direktori baru, mengkloning repo dari jarak jauh:
git clone git@github.com:username/repo.git
Saya kemudian memindahkan file tambalan ke folder baru, dan menerapkannya dan mengkomitnya dengan pesan komit yang tepat (ini dapat ditempel dari git log
atau gitk
jendela):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Ini memulihkan hal-hal untuk saya (dan perhatikan mungkin ada cara yang lebih cepat untuk melakukannya untuk sejumlah besar komitmen). Namun saya ingin melihat apakah pohon di repo yang rusak dapat diperbaiki, dan jawabannya adalah bisa. Dengan repo yang diperbaiki tersedia di atas, jalankan perintah ini di folder yang rusak:
git fsck
Anda akan mendapatkan sesuatu seperti ini:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Untuk melakukan perbaikan, saya akan melakukan ini di folder yang rusak:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
yaitu menghapus file yang rusak dan menggantinya dengan yang baik. Anda mungkin harus melakukan ini beberapa kali. Akhirnya akan ada titik di mana Anda dapat menjalankan fsck
tanpa kesalahan. Anda mungkin akan memiliki garis "menggantung komit" dan "menggantung gumpalan" dalam laporan, ini adalah konsekuensi dari rebases Anda dan mengubah dalam folder ini, dan itu OK. Pengumpul sampah akan menghapusnya pada waktunya.
Jadi (setidaknya dalam kasus saya) pohon yang rusak tidak berarti komitmen yang tidak dicuri akan hilang.