Git の破損したマスター ブランチ

Git の破損したマスター ブランチ

Visual Studio プロジェクト用に Windows 7 で gitExtensions を使用して Git リポジトリを開きます。突然、空になります。リポジトリは存在しますが、コミットはすべて消えてしまいました。

私はグラフィカル インターフェイスを使用していますが、更新されてから初めて開いたと思います。

コミットを取り戻すにはどうしたらよいかわかりません。

入力すると

git log 

私は受け取ります

致命的: デフォルト リビジョン 'HEAD' が不正です

アップデート
見てからhttps://stackoverflow.com/questions/1545407/壊れたgitリポジトリの回復私は試した

git の fsck

返された結果:

エラー: 無効な HEAD
致命的: ルーズ オブジェクト 36b7d9e1ca496bcb864c0b9c8671fcec97fbda31 (.git/obj ects/36/b7d9e1ca496bcb864c0b9c8671fcec97fbda31 に保存) が破損しています

コミットすると次の結果が返されます:

エラー: 参照 HEAD を解決できません: そのようなファイルまたはディレクトリはありません
致命的: HEAD 参照をロックできません

マスターブランチのログ出力

$ git log master 警告: 壊れた参照 refs/heads/master を無視します。警告: 壊れた参照 refs/heads/master を無視します。致命的: あいまいな引数 'master': 不明なリビジョンまたはパスが作業ツリーにありません。パスとリビジョンを区切るには '--' を使用します

関連性がありそうなものを貼り付け続けるだけです

$ git reflog master
警告: 壊れた参照 refs/heads/master を無視します。
警告: 壊れた参照 refs/heads/master を無視します。
致命的: あいまいな引数 'master': 不明なリビジョンまたはパスが作業ツリーにありません。
パスとリビジョンを区切るには '--' を使用します

さらに役立つかもしれない情報: 破損したファイルを削除するたびに、別のファイルがその場所を占めます。マスター ブランチが間違ったものを指し示しているか何かと関係があるのではないかと考え始めています。ヘッドがマスターを指していると想定しているからです。

1 日後:
それで、私は友人にこの件について相談しました。彼はログを調べることができ、ログ内のハッシュがフォルダ内のオブジェクトと一致しないと言いました。彼はマスター ブランチをログにリセットするか何かを試しましたが、私は少し混乱してしまいました。参考になれば幸いです。

答え1

リポジトリは存在しますが、コミットはすべて消えてしまいました。

正確にはどういう意味ですか? 作業ツリーはまだありますか?.git/存在しますか? そこにファイルはありますか?

あなたが投稿したメッセージは、ファイルが.git/HEAD存在しないことを示唆しています。これは、作業ツリー (チェックアウトしたもの) の予想される状態を定義します。そのファイルがなくなると、git はあなたがどこにいたかわかりません。

次の内容のファイルを自分で作成してみることもできます: ref: refs/heads/master

別のブランチにいる場合は、「master」をブランチ名に置き換えるだけです。ブランチにいない場合は、より複雑になります。

.git/logs/HEADHEAD の過去の状態を記録し、後の行は一番下に表示されます。この例の行はチェックアウトを示しています。 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <[email protected]> 1346938344 +0200 checkout: moving from master to MySuperBranch

先頭の SHA1 はコミットを表します。これらは、たとえばブランチ ログで見つけることができるはずです.git/logs/refs/heads/master

あなたが提供した git reflog 出力もrefs/heads/master欠落しているようです。その唯一の内容は、最新のコミットの SHA1 (および改行) であるはずです。最新の SHA1 は、たとえば、ブランチ ログの末尾にあります.git/logs/refs/heads/master

答え2

.git/HEAD が存在し、その内容がref: refs/heads/masterファイル refs/heads/master をチェックする場合、最後のコミットの sha1 が含まれている必要があります。

そのファイルが破損していて NULL 文字でいっぱいの場合は、そのファイルを編集して、最新のコミットの sha1.git/logs/HEADまたはその前のコミットを入力します。

次にgit reset --hard 'sha1 of the commit that you selected'

答え3

リポジトリが破損しているようです。最も簡単な方法は、バックアップからリポジトリを復元するか、元のソースからリポジトリを再クローンすることです (リポジトリに大量の作業が含まれていないことを前提とします)。

復元/クローンが選択肢にない場合は、以下を読むことをお勧めします。プロGit(無料オンラインブックまたは紙版)。この本は全体的に非常に有益ですが、特に最後の章を読んでGitの内部動作を理解してください。Gitの仕組みを理解したら、Linusの破損したオブジェクトの回復手順

答え4

しばらくウェブをサーフィンした後、ようやくこれを見つけて、うまくいきました。

git fetch origin
git reset --hard origin/master

関連情報