Git破損マスターブランチ


9

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

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

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

入力すると

git log 

私は受け取ります

fatal:badデフォルトリビジョン「HEAD」

/programming/1545407/recovering-broken-git-repository
を確認した後、更新しました

git fsck

それは戻った:

エラー:無効なヘッドの
致命的:緩いオブジェクト36b7d9e1ca496bcb864c0b9c8671fcec97fbda31(.git / obj ects / 36 / b7d9e1ca496bcb864c0b9c8671fcec97fbda31に格納)が破損しています

返品の確定:

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

マスターブランチの戻りのロギング

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

関連性のあるものを貼り付け続ける

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

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

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



1
@heavydは更新を確認してください
MrJDは

回答:


3

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

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

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

次の内容で、自分でファイルを作成してみてください。 ref: refs/heads/master

別のブランチを使用していた場合は、「master」をブランチ名に置き換えてください。ブランチにいなかった場合は、さらに複雑になります。

.git/logs/HEADHEADの過去の状態を記録し、後の行を下部に表示します。次の例の行は、チェックアウトを示しています。 25f2a6099fb5f9f2192a510c42f704f9fc4bcecb 65abb1a3dc102e2498860f01fb179cda4c51decb Rainer Blome <rainer.blome@wherever.you.are.com> 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文字でいっぱいの場合そのファイルを編集して.git/logs/HEAD、最後のコミットの直前または最後のコミットのsha1を置きます。

それから git reset --hard 'sha1 of the commit that you selected'


それは確かにNULL文字でいっぱいだったので、前のコミットのsha1に入れましたが、その後gitリセットを実行すると、「エラー:update 'ref failed for ref' HEAD ':cannot lock ref' HEAD ':cannot resolve reference HEAD:Invalid argument "
17

1

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

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


だから悲しいことに、隠しファイルをバックアップしていなかったので、.gitは隠されていました。本を全部読む時間があまりないのですが、何か試してみたいと思ったことはありますか?
MrJDは2012年

「内部についての本を読んでください」というのは、堅実な一般的なアドバイスかもしれませんが、目前の特定の問題や質問に対処するのに役立ちません。
Burhan Ali

0

しばらくウェブを閲覧してみて、ようやくこれを見つけてうまくいきました。

git fetch origin
git reset --hard origin/master

これはorigin(ローカルで行われた作業が多すぎないことを願って)変更を取得し、ローカルmasterブランチにリモートとの同意を強制します。慎重に、--reset手段は破棄任意のローカルな変更を!さらに、それがあまり壊れていなければgit reset origin/mastermasterブランチの最後の既知の(チェックインされた)状態を復元するだけです。
フォンブランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.