web-dev-qa-db-ja.com

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

VisualStudioプロジェクト用にWindows7でgitExtensionsを使用してGitリポジトリを開きます。いきなり空になります。リポジトリは存在しますが、私のコミットはすべて消えました。

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

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

入力すると

git log 

私は受け取ります

fatal:bad default Revision'HEAD '

更新
見てから https://stackoverflow.com/questions/1545407/recovering-broken-git-repository 試しました

git fsck

それが戻った:

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

返品のコミット:

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

マスターブランチのログが返されます

$ git log master警告:壊れたref refs/heads/masterを無視します。警告:壊れたref refs/heads/masterを無視します。致命的:あいまいな引数 'master':不明なリビジョンまたはパスが作業ツリーにありません。 '-'を使用して、パスをリビジョンから分離します

関連する可能性のあるものを貼り付け続けるだけです

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

より有用な情報:破損したファイルを削除するたびに、別のファイルが代わりに使用されます。私はそれが間違ったものか何かを指しているマスターブランチと関係があると考え始めています。頭がマスターを指していると思うからです。

1日後:
それで、私はこれに私の仲間を連れて行きました、彼はログを調べることができました、そして彼はログのハッシュがフォルダーのオブジェクトと一致しないと言いました。彼はマスターブランチをログなどにリセットしようとしましたが、私は少し迷子になりました。お役に立てば幸いです

9
MrJD

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

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

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

次のコンテンツを使用して、自分でファイルを作成してみてください:ref: refs/heads/master

別のブランチを使用している場合は、「master」をブランチ名に置き換えてください。あなたがブランチにいなかったら、それはもっと複雑になるでしょう。

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

前のSHA1はコミットを参照します。 .git/logs/refs/heads/masterのように、ブランチログでこれらを見つけることができるはずです。

あなたが与えたgitreflog出力もrefs/heads/masterが欠落しているように見えます。その唯一のコンテンツは、最新のコミット(および改行)のSHA1であると想定されています。最新のSHA1は、ブランチログの最後にあります(例:.git/logs/refs/heads/master)。

3
Rainer Blome

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

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

次に、git reset --hard 'sha1 of the commit that you selected'を実行します

2
zaki

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

再設定/クローン作成がオプションでない場合は、 Pro Git (無料のオンラインブックまたは 紙版 )を読むことをお勧めします。本全体は非常に有益ですが、特に最後の章を見て、Gitが内部でどのように機能するかを理解してください。 Gitがどのように機能するかを理解したら、Linusの 破損したオブジェクトを回復するための手順 を見てください。

1
heavyd

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

git fetch Origin
git reset --hard Origin/master
0
Leye Odumuyiwa