信頼性の確保

リポジトリの不正を確認する

git-fsck(1) コマンドはリポジトリに対してたくさんの自己一貫性チェックを 実行し、あらゆる問題を報告します。この作業にはいくらかの時間が かかります。最も多い警告は "dangling" オブジェクトに関するものです:

$ git fsck
dangling commit 7281251ddd2a61e38657c827739c57015671a6b3
dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a63
dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b5
dangling blob 218761f9d90712d37a9c5e36f406f92202db07eb
dangling commit bf093535a34a4d35731aa2bd90fe6b176302f14f
dangling commit 8e4bec7f2ddaa268bef999853c25755452100f8e
dangling tree d50bb86186bf27b681d25af89d3b5b68382e4085
dangling tree b24c2473f1fd3d91352a624795be026d64c8841f
...

Dangling オブジェクトは無害です。悪くとも幾らかのディスクスペースを 余計に消費するだけです。これらは時に紛失した作業内容を復旧させる 最後の機会を与えてくれます — 詳細は the section called “Dangling オブジェクト” を参照してください。

過去の変更を復旧させる

参照ログ(Reflogs)

git-reset(1) —hard を使用してブランチを修正した後に 履歴上でそれを参照しているのがそのブランチであることに気がついたと します。

幸運なことに、git は "reflog" と呼ばれるログを保持しており、 各ブランチの過去全ての値を保持しています。従ってこの場合 古い履歴を例えば次のようにして見つけ出すことができます:

$ git log master@{1}

このコマンドは "master" ブランチヘッドの1つ前のバージョンから到達可能なコミットの一覧を表示します。 この構文は git log 以外にもコミットを引数に持つ任意の git コマンドに利用 できます。以下は例です:

$ git show master@{2}           # 2つ前のブランチの状態を表示
$ git show master@{3}           # 3つ前のブランチの状態を表示
$ gitk master@{yesterday}       # 昨日の状態を表示
$ gitk master@{"1 week ago"}    # 1週間前の状態を表示
$ git log --walk-reflogs master # master に対する reflog エントリを表示します

分割された reflog は HEAD を保つため、

$ git show HEAD@{"1 week ago"}

は、1週間前に現在のブランチが指していた場所を指すのではなく、 1週間前に HEAD が指していた場所を表示します。 これにより、チェックアウトしていた場所の履歴を確認することができます。

reflog はデフォルトでは30日間保存され、その後削除されます。 git-reflog(1)git-gc(1) を参照すると、 reflog がどのように削除されるかを学ぶことができます。 詳細は git-rev-parse(1) の "SPECIFYING REVISIONS" の節を参照してください。

reflog の履歴は通常の git の履歴と大きく違うことに注意してください。 通常の履歴は同じプロジェクトの各リポジトリ間で共有されますが、 reflog は共有されません:あなたのローカルリポジトリのブランチが時間と ともにどのように変更されたかを説明するだけです。

dangling オブジェクトを試す

いくつかの場面で、reflog を用いても救済できない場合があります。例えば、 ブランチを削除した後に、そこにあった履歴が必要になったような場合です。 この時は reflog もまた削除されます;しかし、リポジトリをまだ削除していない場合は、 git fsck がリポートする dangling オブジェクト内に削除したコミットを見つけられる 場合があります。詳細は the section called “Dangling オブジェクト” を参照してください。

$ git fsck
dangling commit 7281251ddd2a61e38657c827739c57015671a6b3
dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a63
dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b5
...

これら dangling コミットの一つを例えば以下のようにして見ることができます。

$ gitk 7281251ddd --not --all

これは見たままのことをします:つまり、dangling コミットが表示する コミット履歴のうち、存在する全てのブランチとタグに含まれていないコミットを 表示します。従って、紛失したそのコミットから到達可能な履歴を全て 得ることができます。 (それは単に1つのコミットではないかもしれない点に注意してください: "ラインの先端(tip)"を dangling として報告するだけであり、捨てられた深く複雑な コミットの全てであるかもしれないからです)

履歴を元に戻したい時は、それを参照する新しいブランチを作成してください。 例えば、次のようにします:

$ git branch recovered-branch 7281251ddd

dangling オブジェクトの他の型 (blob や tree)も存在します。 それらは他の状況で発生します。