質問: 御世話になります。 git hub 初心者になります。 新しく git を使ったプロジェクトを始めたのですが、開発にあたり、削除コマンドを調べることになりました。 失敗しても元通りできるので、開発しやすいと考えました。 しかし、git で削除というワードを検索すると、 ``` rm reset clean revert ``` というコマンドと「追跡対象」という概念が出てきました。 「追跡対象」の扱いで、上記のコマンドの使い分けがされていると推測しています。 しかし、「追跡対象」という日本語が、イメージできず、上記のコマンドの使い分けが出来ずに困っています。 私は、「追跡対象」とは、変更した時にその変更を覚えておく対象だと考えています。 単純な解釈でわかりやすく説明していただけないでしょうか?
回答: 「追跡対象」とは ========= ここで言う「追跡対象」とは、わかりやすく言えば**バージョン管理の対象としてGitに登録してあるファイル**のことです。 > > 変更した時にその変更を覚えておく対象 > > > という認識で問題無いと思われますが、正確には「変更した時」ではなく「コミットした時」ですね。 なお、「追跡」という言葉は「tracking」を直訳した言葉であり、「追跡ブランチ」のようにブランチに対して使われた場合「あるブランチを追いかけているブランチ」という意味になります(「`master`は`origin/master`を追跡している」「`origin/master`はリモート`origin`の`master`ブランチを追跡している」)。 各コマンドの説明 ========= `rm` **指定したファイルをバージョン管理の対象から外すコマンド**です。ファイルは削除され、コミットすると以後そのファイルはGitの管理対象から外されます。 おそらくGitにおいて「削除」と言ったらこれを指すのではないでしょうか。 `reset` **今チェックアウトしているブランチが指すコミットを強制的に変更したり、indexの内容をチェックアウトしているコミットの内容に戻したり、作業コピーの内容をindexの内容に戻したりするコマンド**です。 「たり」が多いですが、実際`reset`コマンドはいくつかの機能を複合したものであり、コマンドの実行方法や指定したオプションによって使われる機能が変わってきます。 もし「index」や「staging」の概念をまだ知らないのであれば、きちんと知っておいてください。他のバージョン管理システムには無いGit特有の概念です。 例えば単に`git reset`すると、indexの内容のみが今チェックアウトしているコミットの内容に戻り、作業コピーの内容は変更されません。間違えて`add`や`rm`してしまった時などにどうぞ。 `--hard`オプションを付けて`git reset --hard`すると、上に加えて作業コピーの内容も戻され、作業コピーの内容が今いるコミットの内容に戻ります。コミットしていない変更をすべてリセットしたいときにどうぞ。 更にコミットを指定して`git reset --hard `とすると、今いるブランチが指定したコミットへ強制的に移動され、さらにindex・作業コピーの内容もそれに合うように書き換えられます。`origin/*`以前でやっちゃダメよ。 他にも色々オプションがあるのでご自分で調べてください。 `clean` **作業ディレクトリにあるバージョン管理外のファイルをお掃除するコマンド**です。開発中にできたキャッシュ等のゴミファイルを削除してくれます。ただしバージョン管理対象外のファイルをすべて削除してしまうので、その中に必要なファイルが含まれないか注意してください。 従って、`git reset --hard && git clean -xdf`すると、作業ディレクトリの内容がチェックアウトしているコミットの内容に完全に一致します。とにかく全部リセットしたいときに使えます。 `revert` **指定したコミットの逆コミットを作るコマンド**です(「逆コミット」は今勝手に考えた言葉です)。上の3つとは違い、新たにコミットが作られます。 以前行ったコミットを取り消したいと思ったとき、そのコミットを`revert`すると、そのコミットの変更を逆にしたコミットを作成してくれます。失われる歴史が無いので安心して使えます。ただしもちろん、そのコミットと同じ行を何度か編集していた場合は競合が起こります。