Git の変更を取り消す | git clean

git clean コマンド

git clean は、作業ディレクトリから追跡されていないファイルを削除するコマンドである。git status を使えば追跡対象ではないファイルを確認し、手動で削除することも簡単なので、このコマンドは主に利便性を高めるために用意されている。通常の rm コマンドと同じく、git clean は取り消せないため、実行する前に追跡されていないファイルを本当に削除してよいか確認してほしい。

git cleangit reset --hard とよく組み合わせて使われる。すでに説明したように、reset が作用するのは追跡対象のファイルだけなので、追跡されていないファイルを整理するには別のコマンドが必要になる。この 2 つのコマンドを一緒に使うと、作業ディレクトリを特定のコミット時点と完全に同じ状態に戻せる。

使い方

git clean -n

git clean のドライランを行うコマンドである。削除される予定のファイルを表示するが、実際には削除しない。

git clean -f

追跡されていないファイルを現在のディレクトリから削除するコマンドである。設定オプション clean.requireForcefalse に設定されていない限り、このオプションはデフォルトで true なので、-f force フラグが必須である。このコマンドは、追跡されていないディレクトリや .gitignore で指定されたファイルは削除しない。

git clean -f <path>

追跡されていないファイルを削除するが、その範囲を指定したパスに限定するコマンドである。

git clean -df

現在のディレクトリから、追跡されていないファイルと追跡対象外のディレクトリを削除する。

git clean -xf

現在のディレクトリから、追跡されていないファイルと、Git が通常は無視するファイルを削除する。

補足説明

git reset --hardgit clean -f は、ローカル作業の結果を破棄して最初からやり直したい場合によく一緒に使われる。この 2 つのコマンドを実行すると、作業ディレクトリの状態は直前のコミット時点に戻り、その状態から作業を再開できる。

git clean は、ビルド後に作業ディレクトリを整理する場合にも便利である。たとえば、C コンパイラが生成した .o.exe バイナリファイルを簡単に削除できる。この作業は、リリース用にプロジェクトをパッケージングするときに必要になる場合がある。この目的には -x オプションが便利である。

また、git cleangit reset と並んで、コミット内容を完全に削除してしまう可能性がある数少ない Git コマンドの 1 つであり、使用には注意が必要である。実際に重要な作業内容を失うことが多いため、Git は通常 -f フラグの指定を必須にしている。これにより、単純な git clean の実行で誤ってすべてを失うことを防げる。

使用例

次の例は、新しく作成されたファイルを含め、作業ディレクトリ内のすべての変更を取り消す。ここでは、すでにいくつかのスナップショットをコミット済みで、さらに新しい実験的な開発の途中にあると仮定する。

# Edit some existing files
# Add some new files
# Realize you have no idea what you're doing

# Undo changes in tracked files
git reset --hard

# Remove untracked files
git clean -df

この一連の resetclean コマンドを実行すると、作業ディレクトリとステージング領域は直前のコミット時点と完全に同じ状態になる。git status を実行すると作業ディレクトリがクリーンであることが表示されるため、その状態から再開できる。

また、git reset セクションの 2 番目の例とは異なり、新しく作られたファイルはリポジトリに一度もステージされていない点に注意してほしい。その結果、これらの新しいファイルは追跡対象ではないため、git reset --hard の影響を受けず、削除するには git clean が必要になる。