特定のコミットを表示するため、コマンドラインで git show
を使うと、致命的エラーが発生することがあります。
たとえば、以下のコマンドを入力して、ローカルで bad object
のエラーが発生したとします。
$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592
しかし、以下のように GitHub Enterprise Serverのインスタンスでコミットを表示すると、問題が発生しません。
github.com/$account/$repository/commit/1095ff3d0153115e75b7bca2c09e5136845b5592
この場合、以下の原因が考えられます:
- ローカルのリポジトリが古い。
- そのコミットが属するブランチが削除されたため、コミットが参照できなくなっている。
- 誰かがコミットをフォースプッシュで上書きした。
ローカルのリポジトリが古い
ローカルのリポジトリがまだコミットを取得していないことも考えられます。 リモートリポジトリからローカルクローンに情報を取得するには、以下のように git fetch
を使用します:
$ git fetch remote
これにより、チェックアウトしたファイルに変更が加えられることなく、リモートリポジトリからローカルクローンに、情報が安全にコピーされます。 フォーク元のリポジトリから情報を取得するには、git fetch upstream
を使用します。また、クローンのみを行ったリポジトリから情報を取得するには、git fetch origin
を使用します。
参考: 詳しい情報については、Pro Git ブックのリモートの管理とデータのフェッチをお読みください。
コミットのあるブランチが削除された
リポジトリのコラボレーターが、そのコミットを持つブランチを削除した、あるいはブランチにフォースプッシュした場合、見つからないコミットは孤立している (つまり、どの参照からもたどり着けなくなっている) ため、ローカルクローンにフェッチできません。
幸いコラボレーターの誰かが、見つからなくなったコミットを持つリポジトリのローカルクローンを持っている場合は、それを GitHub Enterprise Serverにプッシュして戻してもらうことができます。 コミットがローカルブランチに参照されていることを必ず確認してから GitHub Enterprise Serverに新しいブランチとしてプッシュするよう依頼してください。
たとえば、コラボレータの一人が、コミットを含むローカルブランチ (B
とします) をまだ持っていたとします。 このローカルブランチは、フォースプッシュまたは削除されたブランチをトラッキングしていると考えられます。そして、まだ更新されていません。 コミットが失われないうちに、そのローカルブランチを GitHub Enterprise Server の新しいブランチ (recover-B
とします) にプッシュしてもらいましょう。 ここでは仮に、upstream
という名前のリモートがあり、これを通して github.com/$account/$repository
にプッシュアクセスがあるとします。
コミットを持つローカルブランチを持っている人が、以下のコマンドを実行します:
$ git branch recover-B B
# コミットを参照する新しいローカルブランチを作成
$ git push upstream B:recover-B
# ローカル B を新しい上流ブランチにプッシュし、コミットへの新しい参照を作成
次に、あなたが以下のコマンドを実行します:
$ git fetch upstream recover-B
# ローカルリポジトリへコミットをフェッチ。
フォースプッシュは避けましょう
絶対に必要でない限り、フォースプッシュは避けましょう。 特に、リポジトリにプッシュできる人が 2 人以上いる場合は避けるべきです。