1. ホーム
  2. git

[解決済み] Git で孤立したコミットをブラウズする

2022-08-20 20:15:21

質問

今朝 msysgit をロードしたら、カレントディレクトリの後にブランチ名が表示される代わりに "((ref: re...))" と表示され、 'git status' はすべてを新しいファイルとして報告し、 'git log' と 'git reflog' は "fatal: bad default revision 'HEAD'" などと教えてくれて、その通りでした。

git reflog --all' や 'gitk --all' を実行すると、リポジトリの残りの部分は無傷であることがわかります。しかし、私が作業していたブランチは消えてしまったようで、HEAD が存在しない/何も指していないように見えるのはこのためです。

git があらゆる種類の情報を保持していることは知っていますし、私のコミットが何らかの形で孤児になってしまったのだと思います。ですから、それらのコミットを表示して HEAD をリセットできるようなコマンドはないでしょうか?

EDIT: なんということでしょう。git fsck」を見つけたのですが、「git fsck --full」は "fatal: object 03ca4... is corrupted" と報告しています。これはいったいどうしたらいいのでしょうか?

EDIT: やれやれです。別のブランチをチェックアウトして、同じ名前で元のブランチを 'git checkout -b lostbranchname' で再作成しようとしたら、git は "error: unable to resolve reference refs/heads/lostbranchname: No error, fatal: Failed to lock ref for update: No error" と言ってきました。エラーなし」というのは、特に厄介なエラーなのでしょう。というわけで、まだウロウロしているようですが、使うこともできず、殺すこともできない状態です。

EDIT: 超超超やばい。ここで提案されているように、いろいろと解凍したり、詰め替えたり、入れ替えたりしてみました。 ハードディスクの故障で壊れたGitオブジェクトを復元するには? しかし今度は、'git status' のような無害なものに対して、別のハッシュが破損していると報告されるようになったのです。全体がダメになったのだと思います。Gitは素晴らしいものですが、このようなことに対処する必要はないはずです。

どうすれば解決する?

このまま放置しておくよりは、私自身の疑問に対する答えを与えておこうと思います。使用方法 git reflog --all を使用することは、孤立したコミットを閲覧する良い方法です。そして、そこからSHA1ハッシュを使用して、歴史を再構築することができます。

私の場合、リポジトリが破損していたので、これは役に立ちませんでしたが。 git fsck は、リポジトリ自体のエラーを見つけたり、時には修正するのに役立ちます。