Repositori git saya entah bagaimana menjadi miring - Saya memuat msysgit pagi ini dan alih-alih nama cabang ditampilkan setelah direktori saat ini, ia mengatakan "((ref: re ...))", 'status git' melaporkan semuanya sebagai file baru, 'git log' dan 'git reflog' beri tahu saya "fatal: revisi default buruk 'HEAD'", dan seterusnya.
Melakukan 'git reflog --all' atau 'gitk --all' menunjukkan kepada saya bahwa sisa repositori masih utuh, tetapi sepertinya cabang yang saya kerjakan baru saja menghilang, yang menjelaskan mengapa HEAD tampaknya tidak ada / menunjuk ke apapun.
Saya tahu git menyimpan semua jenis gumpalan informasi, dan saya berasumsi bahwa komit saya entah bagaimana menjadi yatim piatu, jadi apakah ada beberapa perintah yang akan menunjukkan kepada saya komit tersebut sehingga saya dapat mengatur ulang HEAD ke mereka?
EDIT: Ya ampun. Saya menemukan 'git fsck', dan 'git fsck --full' melaporkan "fatal: object 03ca4 ... rusak". Apa yang bisa saya lakukan tentang itu?
EDIT: Oh sayang oh sayang. Saya memeriksa cabang lain, lalu mencoba membuat ulang cabang asli dengan nama yang sama menggunakan 'git checkout -b lostbranchname', dan git mengatakan "kesalahan: tidak dapat menyelesaikan referensi referensi / kepala / nama cabang yang hilang: Tidak ada kesalahan, fatal: Gagal untuk mengunci ref untuk pembaruan: Tidak ada kesalahan ". 'Tidak ada kesalahan' pasti merupakan kesalahan yang sangat parah. Jadi sepertinya masih berkeliaran, tapi tidak bisa digunakan dan tidak bisa dibunuh.
EDIT: Super duper ya ampun. Saya telah melakukan banyak pembongkaran dan pengemasan ulang dan penggantian hal-hal seperti yang disarankan di sini: Bagaimana memulihkan objek Git yang rusak karena kegagalan hard disk? , tapi sekarang saya mendapatkan hash lain yang dilaporkan korup, untuk sesuatu yang tidak berbahaya seperti 'status git'. Saya pikir semuanya disemprot. Git menyenangkan dan semuanya, tapi aku seharusnya tidak berurusan dengan hal semacam ini.
git checkout -b lostbranchname
- jika Anda hanya peduli tentang nama cabang (bukan isinya), Anda dapat menghapus (atau mengganti nama) secara manual.git/refs/heads/lostbranchname
- mudah-mudahan akan berhasil.Jawaban:
Daripada membiarkan ini terbuka, saya pikir saya akan memberikan jawaban untuk pertanyaan saya sendiri. Menggunakan
git reflog --all
adalah cara yang baik untuk menelusuri komit yatim piatu - dan menggunakan hash SHA1 dari situ Anda dapat merekonstruksi riwayat.Namun dalam kasus saya, repositori rusak jadi ini tidak membantu;
git fsck
dapat membantu Anda menemukan dan terkadang memperbaiki kesalahan dalam repositori itu sendiri.sumber
[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&
(edit: bayangkan double backticks di mana satu - escaping tampaknya tidak berfungsi di sini)Dengan git 2.9.x / 2.10 (Q3 2016), Anda tidak perlu menggunakan
git reflog --all
lagi,git reflog
sudah cukup.Lihat commit 71abeb7 (03 Jun 2016) oleh SZEDER Gábor (
szeder
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 7949837 , 06 Jul 2016)sumber
Salah satu fitur bagus dari git adalah ia mendeteksi korupsi. Namun, tidak termasuk koreksi kesalahan untuk melindungi dari korupsi.
Saya harap Anda telah mendorong konten repositori ini ke komputer lain atau Anda memiliki cadangan untuk memulihkan bagian yang rusak.
Saya tidak memiliki pengalaman dengan git di windows tetapi belum pernah melihat perilaku seperti ini dengan git di Linux atau OS X.
sumber
Saya biasanya menemukan
git reflog
hasilnya membingungkan. Jauh lebih mudah bagi saya untuk memahami grafik komit darigit log --graph --reflog
. Mengganti format untuk hanya menampilkan ringkasan komit juga dapat membuat grafik lebih mudah diikuti:Dari situ jelas bahwa
e3124bf
dan6a7a52e
merupakan yatim piatu yang tidak direferensikan, dan ada konteks dari leluhur mereka yang melakukan.sumber
git reflog --all
tidak menunjukkannya, dengangit log --graph --reflog
mereka sangat terlihat ...