Gitがブランチの切り替えをブロックする理由PRのレビューや最新のアップデートを取得するためにブランチを切り替えようとして、git checkout main を実行した際、成功メッセージの代わりに技術的なブロックによって停止させられることがあります。エラーは以下のように表示されます:
error: The following untracked working tree files would be overwritten by checkout:
config/settings.local.php
dist/bundle.js
Please move or remove them before you switch branches.
Aborting
このエラーは安全機能です。Gitはあなたのデータを保護しています。このエラーは、Gitがまだ追跡していないファイルがフォルダ内にある一方で、移動先のブランチに同じファイルパスが追跡対象として存在する場合に発生します。もしGitが切り替えを許可してしまうと、ローカルファイルがリポジトリのバージョンで上書きされ、ローカルでの作業内容が即座に削除されてしまいます。
まずは原因を特定するデータを削除する可能性のあるコマンドを実行する前に、これらのファイルが実際に何であるかを確認してください。dist/bundle.js のような50MBのビルド成果物でしょうか、それとも1時間かけて調整した1KBの構成ファイルでしょうか?git status を実行して全リストを確認します。
git status
エラーメッセージにリストされているファイルが「Untracked files」の下に表示されている場合は、そのデータの重要度に応じて、次の4つの方法のいずれかを選択してください。
解決策1:手動バックアップ(最も安全)機密性の高いAPIキーや、まだコミットしていないコードが含まれている場合は、ファイルを移動してください。ファイルが不要かどうか100%確信が持てない場合は、この方法が最適です。安全を確保するために数秒しかかかりません。
# リポジトリの外に一時的なバックアップフォルダを作成する
mkdir ../git_backup
# 競合しているファイルを移動する
mv config/settings.local.php ../git_backup/
# ブランチを切り替える
git checkout destination-branch
切り替え後、バックアップしたバージョンとGitがプルしたバージョンを手動で比較できます。
解決策2:Git Clean を使用する(ビルド時のゴミに最適)競合がビルド成果物、ログファイル、または node_modules の残骸から発生している場合があります。これらのファイルが不要な場合は、git clean を使用して一掃します。注意: この操作は永続的であり、元に戻すことはできません。
削除される内容を確認するために、必ず最初に「ドライラン」を実行してください:
git clean -n
リストが安全そうであれば、強制(force)フラグとディレクトリ(directory)フラグを付けてコマンドを実行します:
# -f は強制、-d はディレクトリの削除
git clean -fd
ワーキングツリーがクリアになれば、すぐに git checkout が機能するようになります。
解決策3:強制的な切り替えすぐにブランチを切りたいたく、未追跡ファイルを失っても構わない場合は、強制フラグを使用します。これにより、Gitはローカルファイルよりもリポジトリのバージョンを優先します。
git checkout -f destination-branch
警告: Gitはローカルの未追跡ファイルを上書きします。Gitはこれらのファイルを一度も追跡していないため、後で気が変わっても復元するための履歴は存在しません。
解決策4:追跡してスタッシュ(プロフェッショナルな方法)これらのファイルは最初からリポジトリの一部であるべきだったと気づくかもしれません。その場合は、ファイルを追跡対象にし、一時的にスタッシュに隠してからブランチを移動します。これにより、作業履歴をきれいに保つことができます。
# 1. ファイルをステージングする
git add config/settings.local.php
# 2. 安全にスタッシュする
git stash
# 3. ブランチを切り替える
git checkout destination-branch
# 4. (任意)変更を元に戻す
git stash pop
stash pop を使用し、対象ブランチの同じファイルに異なる内容がある場合、Gitは標準的なマージ競合を発生させます。どの行を残すかを選択できるため、強制的な上書きよりもはるかに安全です。

