トラブルシューティング

.git ディレクトリの誤削除・ネスト問題

.git ディレクトリの役割と、誤削除やネストによるトラブルの原因・対処法

.git ディレクトリの誤削除・ネスト問題 diagram

.git ディレクトリの役割

.git ディレクトリには、リポジトリのすべての履歴情報が格納されています。

コミット履歴、ブランチ情報、リモート設定、設定ファイルなど、Git リポジトリとして機能するために必要なデータがすべて含まれます。

このディレクトリが存在することで、そのフォルダが Git リポジトリとして認識されます。

.git を削除してしまった場合

.git を削除すると、すべての Git 履歴が失われます。

ファイル自体は残りますが、コミット履歴やブランチ情報はなくなります。

リモートリポジトリ(GitHub 等)に push 済みであれば、git clone で再取得できます。

ローカルのみの変更は復元できません。

bash
# リモートから再取得
git clone https://github.com/user/repo.git

# 作業中のファイルがある場合は、別の場所に clone して
# ファイルをコピーする
git clone https://github.com/user/repo.git repo-recovered

.git のネスト問題

Git リポジトリの中で git init や git clone を実行すると、.git ディレクトリがネスト(入れ子)になります。

この状態では、内側のディレクトリが外側のリポジトリに正しく追跡されません。

git add 時に警告が出たり、GitHub 上でフォルダがクリックできないサブモジュールのような表示になることがあります。

bash
# ネストの検出: サブディレクトリに .git がないか確認
ls -la subdirectory/.git

# 以下の警告が出たらネストの可能性あり
# warning: adding embedded git repository: subdirectory

ネスト問題の解決方法

  1. 内側の .git ディレクトリを削除

    rm -rf subdirectory/.git でネストした Git リポジトリを消します。ファイル自体は残ります。

  2. Git のキャッシュからサブディレクトリを外す

    git rm --cached subdirectory で、外側のリポジトリが埋め込みリポジトリとして認識している状態を解消します。

  3. 通常のディレクトリとして再追加

    git add subdirectory/ で普通のフォルダとして追跡します。

  4. コミット

    git commit -m "Fix nested git repository issue" のようにわかりやすいメッセージで記録します。サブモジュールとして扱いたい場合のみ git submodule add を使います。

bash
# 1. 内側の .git を削除
rm -rf subdirectory/.git

# 2. Git のキャッシュをクリア
git rm --cached subdirectory

# 3. 通常のディレクトリとして再追加
git add subdirectory/

# 4. コミット
git commit -m "Fix nested git repository issue"

関連コマンド