Gitで孤立したコミットを閲覧する


102

私のgitリポジトリはどういうわけか狂っています-私は今朝msysgitをロードし、現在のディレクトリの後にブランチ名が表示される代わりに、「((ref:re ...))」と表示され、「git status」はすべてとしてレポートします新しいファイル、「git log」、「git reflog」は、「致命的:悪いデフォルトリビジョン「HEAD」」などを通知します。

'git reflog --all'または 'gitk --all'を実行すると、リポジトリの残りの部分がそのまま表示されますが、作業していたブランチが消えたように見え、HEADが存在しないように見える理由を説明しています/何かを指す。

私はgitがあらゆる種類の情報の塊を保持していることを知っており、私のコミットが何らかの方法で孤立したと想定しているので、それらのコミットを表示してHEADをリセットできるコマンドはありますか?

編集:ああ、親愛なる。「git fsck」を発見し、「git fsck --full」で「致命的:オブジェクト03ca4 ...が壊れています」と報告されました。それについて悪魔は何ができますか?

編集:ああ、親愛なる、親愛なる。別のブランチをチェックアウトしてから、「git checkout -b lostbranchname」を使用して同じ名前で元のブランチを再作成しようとしましたが、gitは「エラー:参照refs / heads / lostbranchnameを解決できません:エラーなし、致命的:失敗しました更新のために参照をロックする:エラーなし」「エラーなし」は特に厄介なエラーでなければなりません。したがって、まだぶら下がっているように見えますが、使用したり殺したりすることはできません。

編集:スーパーデューパーああ、親愛なる。私はここで提案されているように、アンパック、再パック、および物事の交換をたくさん行いました:ハードディスク障害によって損傷したGitオブジェクトを回復する方法?、しかし今、「git status」のような無害なもののために、別のハッシュが破損していると報告されています。私はすべてがホースであると思います。Gitはとても美しいですが、私はこの種のことを扱う必要はありません。


についてgit checkout -b lostbranchname-ブランチの名前だけに関心がある場合(ブランチのコンテンツではない)、手動で削除(または名前の変更)することができます.git/refs/heads/lostbranchname-これでうまくいくでしょう。
アントニーハッチキンズ2010年

1
そして、あなたはこのgitフォルダーをプッシュするアップストリームを持っていませんか?
ラクシュマンプラサード

1
残念なことに、これは実際には劣ったソース管理システムの代理リポジトリのようなものです。他のシステムの手間をかけずに、ローカルで使用してすべてのgitの機能と機能を取得しています。しかし、少なくとも他のシステムがランダムにそれ自体を破損することはありません。それでも、私が失ったのは、すでに回復した他のシステムに最後にチェックインしてからの変更だけです。新しいリポジトリを開始する時が来ました!
ベンハイマーズ2010年

7
gitがあなたに「この種のものに対処する」ようにさせた、またはそれ自体が破損したと言うのをためらうと思います。データの損失に対して完全に安定しているのは、バックアップ以外にはありません。
Cascabel

1
確かに、私は(当然のことながら)かなりの歴史を失ったことを少し自然に感じています。これはgitのせいではありません。他のシステムは、指定されたファイルシステムエラーと同じように動作します。
ベンハイマーズ2010年

回答:


134

このままにしないで、自分の質問に答えたいと思います。git reflog --all孤立したコミットを参照するには、を使用するのが良い方法です。また、SHA1ハッシュを使用すると、履歴を再構築できます。

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


3
ありがとう。これは、Githubで孤立したプルリクエストをプルしようとしたときにこの情報を見つけた唯一の場所です。私の問題を解決しました。
SystemParadox 2012

6
誰もがgitkですべてを必要とする場合:([alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&編集:単一のバック
ティックが

1
素晴らしいヒント@mbx!孤立したコミット間のリンクをグラフィカルに表示できると非常に便利です。
ベンハイマーズ

@BenHymers "rebase / squash"のようなコミット関係でも点線が表示されるとしたら、すばらしいでしょう。それを行う方法をまだ見つけていません。
mbx

上記の回答を書いたとき、reflogについて知りませんでした。とても便利なツールです!
Jamey Hicks

17

git 2.9.x / 2.10(2016年第3四半期)では、git reflog --allもう使用する必要はなく、git reflog十分です。

参照してください71abeb7コミットにより(2016年6月3日)をSZEDERガーボル(szeder
(合併によりJunio C浜野- gitster-7949837コミット、2016年7月6日)を

reflogreflog過去のルートコミットの追跡を続行

リポジトリに複数のルートコミットが含まれている場合、そのHEAD reflogには複数の「作成イベント」、つまり「from」の値がnull sha1であるエントリが含まれる場合があります。
そのようなreflogのリストは、reflogにまだ古いエントリが含まれている場合でも、最初のそのようなエントリで途中で停止します。
これにより、ユーザーはreflogが ' git checkout --orphan'の後に切り捨てられたと考えるようになる可能性があります。

前のreflogエントリの「新しい」値に基づいて、このような作成イベントを過ぎてreflogを歩き続けます。


4

gitの優れた機能の1つは、破損を検出することです。ただし、破損から保護するためのエラー修正は含まれていません。

このリポジトリのコンテンツを別のマシンにプッシュしたか、破損した部分を回復するためのバックアップがあることを願っています。

私はWindowsでgitを使用した経験はありませんが、LinuxまたはOS Xでgitを使用してこのような動作をしたことはありません。


3

通常、git reflog出力がわかりにくいと思います。のコミットグラフを理解する方がはるかに簡単ですgit log --graph --reflog。コミットの概要のみを表示するようにフォーマットをオーバーライドすると、グラフを理解しやすくなります。

$ git alias graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

それからe3124bf6a7a52eが参照されていない孤児であることは明らかであり、祖先のコミットからのコンテキストがあります。


たった今、失われた作業の時間を節約できました!プッシュされてgit reflog --allいないコミットがあったローカルブランチを誤って削除し、それらを表示しませんでした。git log --graph --reflogそれらは非常に表示されていました...
Adam.Er8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.