git checkout を強制する「-f」オプション

最終更新:2018-07-12 by Joe

git checkout を強制するオプションについてです。

git checkuot <BRANCH_NAME> でブランチを切り替える時、インデックスや作業ツリーの状態が切り替え先のブランチと異なり、かつコンフリクトする時、怒られてブランチの切り替えは自動的に中止してしまいます。

git checkoutを実行すると、怒られるエラーはこんな出力です。

error: Your local changes to the following files
 would be overwritten by checkout: index.php
Please commit your changes or stash them before you switch branches.
Aborting

よく見ますよね、このエラー。それでは、解決していきます。

git checkoutを強制するオプション

git checkout は、「-f」のオプションで、矯正できます。このオプションでは、作業ツリーの変更をすべて破棄して、強制的にブランチを切り替えます。

// 強制的にcheckoutする
git checkout -f <BRANCH>
git checkout --force <BRANCH>

git checkout のエラーで怒られたら、git diff (もしくは、git diff --cached)で差分を確かめて、破棄して大丈夫な変更内容なのかどうかを、確かめてみましょう。

良ければ、そのままこの「-f」オプションでチェックアウトを実行してしまいましょう。

一応、git ドキュメントから抜粋です。

-f, --force

When switching branches, proceed even if the index or the working tree differs from HEAD. This is used to throw away local changes. When checking out paths from the index, do not fail upon unmerged entries; instead, unmerged entries are ignored.
(抜粋元:Git document: git checkout

下記に、日本語の意訳です。細かい間違いは(もしあれば)あしからず・・・。

-f, --force

ブランチを切り替える際に、作業ツリーやインデックスがHEADと異ったとしても、そのままブランチ切り替えを進行します。このコマンドはローカルの変更を破棄するためものです。インデックスからパスをチェックアウトする際には、(作業ツリー上の)マージされていないファイルのせいで失敗することなく、代わりに、それら無視します。

ちなみに、ドキュメントの後半の記述は、「git checkout <tree-ish> — <path>」として「ブランチの切り替え」でなく、「ファイルを作業ツリーに反映する」という操作の際にfオプションを利用したケースについて言及しています。コンフリクトがあっても、無理やり上書きします、という動作に鳴ることに言及していますね。

git checkoutの強制に関する関連リンク

さて、強制的にcheckoutできたでしょうか?では、素敵なgitライフを。