Skip to main content

このバージョンの GitHub Enterprise はこの日付をもって終了となりました: 2023-01-18. 重大なセキュリティの問題に対してであっても、パッチリリースは作成されません。 パフォーマンスの向上、セキュリティの向上、新機能の向上を図るために、最新バージョンの GitHub Enterprise にアップグレードします。 アップグレードに関するヘルプについては、GitHub Enterprise サポートにお問い合わせく� さい

コミットが GitHub にはありますが、ローカルにはありません

特定のコミットが、GitHub Enterprise Server上では見えるにもかかわらず、リポジトリのローカルクローンの中には存在しない、という� �合があります。

特定のコミットを表示するため、コマンド ラインで git show を使うと、致命的エラーが発生することがあります。

たとえば、ローカルで bad object エラーが発生する� �合があります。

$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592

しかし、以下のように でコミットを表示すると、問題が発生しません。

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 に新しいブランチとしてプッシュする必要があります。

たとえば、コラボレーターの 1 人が、コミットを含むローカル ブランチ (B と呼ぶ) をま� 持っているとします。 これが、フォース プッシュまたは削除されたブランチをトラッキングしている可能性がありますが、ま� 更新されていません。 そのコミットを保持するために、そのローカル ブランチを GitHub Enterprise Server の新しいブランチ (recover-B と呼ぶ) にプッシュすることができます。 この例では、upstream という名前のリモートがあり、それを介して github.com/$account/$repository へのプッシュ アクセスがあると仮定します。

コミットを持つローカルブランチを持っている人が、以下のコマンドを実行します:

$ git branch recover-B B
# Create a new local branch referencing the commit
$ git push upstream B:recover-B
# Push local B to new upstream branch, creating new reference to commit

これで、"あなた" が次を実行できます。

$ git fetch upstream recover-B
# Fetch commit into your local repository.

フォースプッシュは避けましょう

絶対に必要でない限り、フォースプッシュは避けましょう。 特に、リポジトリにプッシュできる人が 2 人以上いる� �合は避けるべきです。 誰かがリポジトリにフォース プッシュした� �合、フォース プッシュによって、他のユーザーがそれに基づいて作業しているコミットを上書きする可能性があります。 フォース プッシュによってリポジトリの履歴が変更され、pull request が� �損する可能性あります。

参考資料