特定のコミットを表示するため、コマンドラインで 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 人以上いる� �合は避けるべきです。 If someone force pushes to a repository, the force push may overwrite commits that other people based their work on. Force pushing changes the repository history and can corrupt pull requests.