1. ホーム
  2. 記事一覧
  3. 「git clean」でプロジェクトの整理を!安全にきれいを保つ方法

2024.05.12

「git clean」でプロジェクトの整理を!安全にきれいを保つ方法

はじめに

アプリ開発において「Git」は必須スキルになっています。Gitには様々なコマンドが存在し、それらを適切に使用することで、開発作業の安全性を高め、効率化を実現できます。

開発プロジェクトにおいて、テスト実施やバグ修正のために、一時的にテストファイルを作成することがよくあります。テストが終了した後、不要となるファイルを削除する必要がありますが、一つずつ手動で削除するのは大変です。また、必要なファイルを間違えて削除しそうになり、ヒヤっとした経験があります。このような場面では、「git clean」を使用すると、プロジェクト内で不要となったファイルを効率的にクリーンアップすることが可能です。「git clean」の使用には十分な注意が必要ですが、適切に使用すれば便利で強力なコマンドです。この記事では、ファイルを削除するコマンド「git rm」との違いもあわせて「git clean」を解説します。

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

「git clean」について

git cleanコマンドは、Gitの追跡対象外のファイルをワーキングディレクトリから削除します。追跡対象外ファイルとは、リポジトリ内で生成されたが、git addコマンドを使用してステージングされていないファイルのことを指します。テスト実施やバグ修正の過程で一時的に作成されたファイルをはじめ、プロジェクト内で不要となったファイルのクリーンアップにgit cleanは有効です。追跡対象外ファイルは以下のコマンドで調べることができます。この実行結果ではUntracked files:にリストアップされている、Fix.jsxTest.jsxが追跡対象外ファイルです。

git status 
On branch feature#1
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        Fix.jsx
        Test.jsx

nothing added to commit but untracked files present (use "git add" to track)

「git rm」との違い

git rmもファイルを削除するコマンドですが、git cleanと何が異なるのでしょうか?実はgit rmは追跡対象外ファイルを削除することはできません。git rmは現在のHEADに存在し、最新コミットに登録されているファイルに対してのみ実行可能です。これは、git rmが削除できるのは、Gitによって管理されている(追跡されている)ファイルのみであることを意味します。

以下は追跡対象外のファイルにgit rmを試みた際の結果です。メッセージfatal: pathspec 'Fix.jsx' did not match any filesは、Gitの追跡対象外であるか、存在しないファイルということを示しています。git rmは、HEADに存在し追跡されているファイルにのみ機能するということが分かります。

git rm Fix.jsx 
fatal: pathspec 'Fix.jsx' did not match any files

「git clean」使用の際の注意点

データの復元が困難となる

git cleanで削除されるファイルはGitの追跡対象外ファイルのため、Gitを使ってファイルを復元することはできません。コマンド実行前に必ず削除対象となるファイルを確認し、必要なファイルが削除されないようにすることが必須です。

安全な使用のためのオプションの理解

git cleanコマンドを安全に利用するためには、その様々なオプションをしっかりと理解し、適切に活用することが重要です。これにより、コマンドの実行前に具体的にどの操作が行われるかを確認したり、対話モードを利用して削除する項目を細かく指定することが可能になります。開発者が不要データの削除にストレスを感じないよう、様々な工夫が施されています。これらのオプションを理解し適切に使用することで、リスクを最小限に抑えつつ、安全かつ効率的にファイルのクリーンアップを進めることができます。

「git clean」コマンドの開発現場での活用例

  • ビルド後のクリーンアップ

    プロジェクトのビルドプロセス中に生成された一時ファイルやディレクトリが不要になった場合、git cleanを使用することでプロジェクト内を整理できます。

  • テストファイルの削除

    テストコードを書いたりテストデータを生成した際に、後にそのファイルが不要になることがあります。git cleanを使用することで、これらの一時的なファイルを簡単にクリーンアップできます。

  • 新しいブランチへの切り替え時の整理

    開発の中で新しいブランチに切り替える際に、前のブランチで生成した未追跡ファイルがあると、後にプロジェクト内が煩雑になります。git cleanを使用してこれら不要なファイルを削除し、新しいブランチでの作業をスムーズに開始します。

「git clean」の使い方

大規模なプロジェクトでは、ファイル数が急増し、テストやバグ修正の機会も多く発生します。その度にテストデータなどを作成し、修正作業やテストを実施します。作業が終了した後、不要になったテストデータやバグ修正ファイルは、プロジェクトの整理を目的として削除されます。このような場面で、git cleanコマンドが非常に役立ちます。git cleanは通常、様々なオプションを組み合わせて利用されるため、その具体的な使い方は次のセクション「git cleanのオプション紹介」で詳しく説明します。

「git clean」のオプション紹介

このセクションではgit cleanの使い方を、様々なオプションと共に紹介します。実際の開発では、git cleanを安全かつ確実に実行するために、複数のオプションを組み合わせて利用されることが一般的です。実際にコマンドを実行する前に、入力されたコマンドがどのような操作を行うのかをテストし、確認することが推奨されます。さらに、特定のオプションと使用しないとgit cleanが実行されないケースもあります。ファイルが削除された後のデータ復旧は不可能なので、コマンド操作を一つずつ慎重に確認しながら実行しましょう。

項目説明
--force, -f実際にgit cleanを実行
--dry-run, -nコマンドの実行テストを行い「何が削除されるか」を確認
-d未追跡のディレクトリを削除
-x.gitignoreに設定されている未追跡ファイルやディレクトリを含めるすべてのファイルを削除
-X.gitignoreに設定されている未追跡ファイルのみを削除
-iコマンドラインでインタラクティブモードを使用

--force, -f

git cleanを実際に(強制的に)実行するためのオプションです。Gitの設定clean.requireForceはデフォルトでTrueに設定されており、このオプションを指定しないとgit cleanが実行できません。clean.requireForceの設定は、Gitで管理されているファイルやディレクトリを保護するための安全装置として機能します。これは、誤って作業ディレクトリ内のファイルやディレクトリを削除するリスクを減らす目的があります。

git clean -f [削除するファイル名]

clean.requireForceの設定は以下のコマンドで調べられます。以下の実行結果はデフォルトの設定、Trueとなっています。

git config --global clean.requireForce
true

--dry-run, -n

git clean -nは実行前にテスト実行を行い、何が削除されるかを事前に確認することができます。テスト実行することで、誤って重要なファイルを削除するリスクを減らします。-nオプションは、ファイルを安全に削除するための確認ステップとして非常に役立ち、意図しないデータ損失を防ぐための重要なツールです。

git clean -n [削除するファイル名]

git clean -nの実行結果です。以下の実行結果を通して、指定したファイルTest.jsxが削除されることを事前に確認できます。

git clean -n Test.jsx
Would remove Test.jsx

-d

未追跡のファイルだけでなく、未追跡のディレクトリも削除します。削除対象のディレクトリ内にファイルが含まれていても、そのディレクトリと一緒にファイルも削除されます。通常のgit cleanコマンドは未追跡のファイルのみを対象としますが、-dオプションを付けることで、未追跡のディレクトリも削除することが可能になります。このオプションは、作業ディレクトリをより徹底的にクリーンアップしたいときに利用されます。

git clean -d [削除するディレクトリ名]

git clean -dの実行結果です。-dオプションのみでは削除ができないため、-fオプションも併せて使用しています。ディレクトリとその中に格納されているファイルが削除されました。

git clean -df test/
Removing test/

-x

.gitignoreファイルに記載されている、無視される(Gitによって追跡されない)ファイルを含めて、作業ディレクトリ内の未追跡ファイルをすべて削除します。通常、git cleanコマンドはこれらの無視されたファイルを削除しませんが、-xオプションを使用することで、より徹底的なクリーニングを行うことが可能です。

git clean -x

app.logというファイルを作成してテストをします。.gitignore の3行目に*.logの記載があるため、app.logファイルは無視されたファイルとなります。

この状態でgit clean -xnをテスト実行します。通常は削除対象とならない.gitignore に記載されているファイルも削除対象となります。

git clean -xn
Would remove app.log  ←.gitignore に記載されているファイルも削除対象となります
Would remove src/components/Test.jsx 

-X

.gitignoreファイルに記載されている、無視される(Gitによって追跡されない)ファイルだけを削除します。-xと似ていますが、こちらは.gitignoreで設定された無視ファイルのみに対象を限定して削除します。

git clean -X

git clean -Xnの実行結果です。git clean -xnの時とは異なり、.gitignoreに設定されていないsrc/components/Test.jsx は対象外となり、app.logのみが削除対象となります。

git clean -Xn                                                                 
Would remove app.log

-i

コマンドラインでインタラクティブモードを利用します。未追跡のファイルやディレクトリを削除する前に、ユーザーに一つずつ確認を求めるようになります。これにより、ユーザーは削除されるファイルを確認しながら指定することができるため、誤って重要なファイルを削除するリスクを減らすことが可能です。

git clean -i

git clean -iを実行すると、以下のコマンド選択肢が表示されます。インタラクティブモード(対話モード)での作業が可能になります。

 git clean -i
Would remove the following items:
  Test-2.js   Test-2.jsx  Test-3.js   Test-3.jsx  Test.js     Test.jsx
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help

各コマンドの内容は以下のとおりです。

  1. clean:指定したファイルを削除します
  2. filter by pattern:特定のパターンをフィルタリングして削除ファイルを選択します
  3. select by numbers:リストアップされたファイルの中から、削除するファイルを指定します
  4. ask each: リストされた各ファイルについて、1つずつ削除するかどうかを確認します
  5. quit:ファイルを削除せずコマンドを終了します
  6. help:コマンドのヘルプを表示します
  • 2:filter by patternfilter by pattern

    特定のパターンに基づいてファイルをフィルタリングし、削除対象のファイルを選択します。例えば、特定の拡張子を持つファイルを削除する際などに利用されます。

    • フィルタリングする条件を入力して、削除するファイルを選択します。

    • フィルタリングが完了すると、削除対象ファイルが表示されます。実行例の削除対象ファイルは以下の通りです。

      Would remove the following items:Test-2.js Test-3.js Test.js

    • その後、再度コマンド選択肢が表示されるので、cleanを選択しファイルを削除します。

 git clean -i
Would remove the following items:
  Test-2.js   Test-2.jsx  Test-3.js   Test-3.jsx  Test.js     Test.jsx
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> 2
  Test-2.js   Test-2.jsx  Test-3.js   Test-3.jsx  Test.js     Test.jsx
Input ignore patterns>> *.jsx
  Test-2.js  Test-3.js  Test.js
Input ignore patterns>>   ←未入力の状態でエンターを押すとフィルタリングが終了します
Would remove the following items:
  Test-2.js  Test-3.js  Test.js
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> c
Removing Test-2.js
Removing Test-3.js
Removing Test.js
  • 3:select by numbersselect by numbers

    リストアップされたファイルの中から、削除したいファイルを番号で指定します。この方法では、コマンドを一つずつ確認しながら、より慎重に作業を進めることができます。

    • 削除対象ファイルがリストアップされた後、削除したいファイルを指定します。

    • 指定が完了すると、削除対象ファイルが表示されます。実行例の削除対象ファイルは以下の通りです。

      Would remove the following item: Test.js

    • その後、再度コマンド選択肢が表示されるので、cleanを選択しファイルを削除します。

git clean -i
Would remove the following items:
  Test-2.js   Test-2.jsx  Test-3.js   Test-3.jsx  Test.js     Test.jsx  
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> s
    1: Test-2.js     2: Test-2.jsx    3: Test-3.js     4: Test-3.jsx
    5: Test.js       6: Test.jsx
Select items to delete>> 5
    1: Test-2.js     2: Test-2.jsx    3: Test-3.js     4: Test-3.jsx
  * 5: Test.js       6: Test.jsx
Select items to delete>>   ←未入力の状態でエンターを押すとファイル指定が終了します
Would remove the following item:
  Test.js
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> 1
Removing Test.js
  • 4:ask each

    削除対象となるファイルが1つずつ表示され、ユーザーはそれぞれについて削除するかどうかを順番に選択します。ファイルを1つずつ確認しながら慎重に作業を行うことができます。

    • 削除対象になるファイルが1つずつ表示されます。
    • 削除するかどうか、yまたはNを指定します。
    • すべての削除対象ファイルの指定が完了した後、最終的にyを選択したファイルのみが削除されます。
 git clean -i
Would remove the following items:
  Test-2.js   Test-2.jsx  Test-3.js   Test-3.jsx  Test.js     Test.jsx
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> a
Remove Test-2.js [y/N]? N
Remove Test-2.jsx [y/N]? N
Remove Test-3.js [y/N]? N
Remove Test-3.jsx [y/N]? N
Remove Test.js [y/N]? y
Remove Test.jsx [y/N]? N
Removing Test.js

この記事で学んだこと

この記事を通じて、「git clean」に関連する様々な知識を得ることができました。簡単に振り返ってみましょう。

「git clean」について

git cleanコマンドは、Gitの追跡対象外のファイルをワーキングディレクトリから削除します。一方、git rmでもファイルを削除できますが、これは追跡されているファイルの削除に用いられ、追跡対象外のファイルを削除することはできません。

git cleanによって削除されるファイルは、Gitを介してファイルを復元することはできないため、誤って必要なファイルを削除しないよう注意が必要です。適切に使用すれば、プロジェクトのクリーンアップを効率的に行うための便利で強力なツールとなります。

オプションへの理解が重要な理由

git cleanコマンドを安全に利用するためには、様々なオプションをしっかりと理解し、適切に活用することが重要です。これらのオプションには、コマンド実行前にどの操作が行われるかを詳細に確認できるものや、対話モードを使って削除対象の項目を細かく選択できるものなどがあります。これは、誤って重要なファイルを削除するリスクを低減させるために、オプションへの理解が不可欠であることを意味します。自分のニーズに合ったオプションを選択し、ファイル削除を安全かつ効果的に行いましょう。

この記事では「git clean」の基本や実際の利用法に至るまで、その活用法を詳しく解説してきました。

ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事

2020.02.25

完全未経験からエンジニアを目指す爆速勉強法

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

  • キャリア・学習法
  • エンジニア

2024.05.08

リリース管理に欠かせない!コミットにタグを付ける「git tag」コマンドの使い方

アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また特定のコミットに普遍的な目印をつけたい!や、リリースバージョンを管理したい!という方向けに、この記事では「git tag」について解説します。

  • git

2024.02.26

git checkout と git switch それぞれの使い方を比較する

この記事では、switchコマンドの基本的な使い方と機能を紹介します。また、checkoutコマンドとの比較を行い、両者の違いとそれぞれのコマンドが適した使用状況について解説します。最後に、switchコマンドを使った実践的な使用例とベストプラクティスを提供します。

  • PC操作
  • git

2024.05.04

実は便利なGitコマンドgit fetchとは?git pullとの関係もあわせて解説!

今回は「git fetch」を解説します。あまり馴染みのないコマンドかもしれませんが、実はgit pullと関係のあるコマンドです。

  • git