【git】スタッシュに隠した変更が戻せない場合の対処法【stash】
git でバージョン管理しているソースファイルで、スタッシュに隠した変更を戻そうとした際に戻せない場合がある。
スタッシュを使用する典型的な場面といえば、あるブランチで作業中に、他のブランチで急遽修正を行う必要が出てきた場合である。
他のブランチで修正を終えて、もともと作業中だったブランチに切り替え、いざ隠した変更を元に戻そうとするとエラーが発生することがある。
新規追加したファイルで、戻そうとしているファイルが既に存在していると戻せない
エラーメッセージを読むと、
“ファイル名” already exists, no checkout
と記載されている。
これは、変更を隠す前に新規追加したファイルで、スタッシュに変更を隠したときに隠されたファイルが、変更を戻そうとしているタイミングで、すでに存在すると起こる。
例えば、
$ git stash -u
TortoiseGit では「バージョン管理外のファイルを含む」にチェックを入れてスタッシュに隠す
$ git stash -a
TortoiseGit では「すべて」にチェックを入れてスタッシュに隠す
などで、バージョン管理されていないファイルも含んでスタッシュに隠した場合で、特に-a では .gitignore(無視リスト)に記載されているファイルもスタッシュに隠されるため、ビルドしなおすたびにファイルが生成されるようなものが、別のブランチで作業している間に再生成され、スタッシュに戻そうとしたときに既に存在していることがある。
対処法
戻そうとしているファイルが既に存在している状態を解消する必要がある。
先ほどのように、$ git stash -a で無視されたファイルも隠しており、戻そうとした場合に無視リストのファイルが再生成されている場合は、
$ # Xは大文字です。
$ git clean -fX
TortoiseGit では、右クリック →TortoiseGit→ クリーンアップ で〇無視リストに該当するファイルを削除 にチェックして OK
として、無視リストに該当するファイルを削除してしまえばよい。
※当然だが、無視リストに該当するファイルを削除して問題ないか確認が必要。
無視リストも含め、バージョン管理外のファイルをすべて削除してしまってよい場合は、
$ # xは子文字です。
$ git clean -fx
TortoiseGit では、右クリック →TortoiseGit→ クリーンアップ で〇全てのバージョン管理外のファイルを削除 にチェックして OK
とする。