ファイルの削除を記録しよう
今回はファイルの削除を記録するやり方を見ていきます。
ファイルの削除を記録するには、「git add」とは別のコマンドを使う必要があります。
「git add」コマンドの詳細はこちらを参照してください。 phoeducation.work
Gitの場合、ファイルの削除をステージに追加するのには「git add」とは別のコマンドを使います。
また、一度コミットしてしまったファイルをGitの記録から削除するのにも別のコマンドを使います。
それではファイルの削除をするコマンドを見ていきましょう。
コマンドは「git rm」(ギット・リムーブ)コマンドを使います。
ファイルを削除したい時は「git rm <ファイル名>」、ディレクトリを削除したい時は「git rm -r <ディレクトリ名>」と入力します。
$ git rm <ファイル名> $ git rm -r <ディレクトリ名>
「git rm」コマンドを使うとコミットされたGitの記録からも消えますし、自分のローカルであるワークツリーのファイルも消えます。
もしそれが嫌でワークツリーにはファイルを残したいけど、Gitの記録からだけファイルを削除したい時は「git rm --cached <ファイル名>」というコマンドを使います。
$ git rm --cached <ファイル名>
この2つはどういう違いかというと、そもそもファイルがいらなくなったという時は「git rm」や「git rm -r」コマンドを使います。
でもファイルは必要だけど、Gitの記録からだけファイルを削除したい時は「git rm --cached」コマンドを使います。
例えばパスワードが書かれているファイルを間違えてGitの記録に上げてしまった。
パスワードが書かれているファイルは自分のワークツリーには残して置きたいけど、Gitにはのせたくない。
そういう時には「--cached」のオプションを付けて実行します。
ちなみに「rm」は「remove」(削除)の略です。
それではイメージで確認していきましょう。
今ワークツリーに「index.html」というファイルがあって、それをコミットしてリポジトリにも「index.html」が記録されているとします。
「git rm」コマンドを使うと、この両方のファイルが削除されます。
ワークツリーからも削除されますし、リポジトリからも削除されます。
逆にリポジトリからだけ削除したい場合、これが「git rm --cached」になります。
この違いもあまり難しく考えることなくイメージを押さえておいてください。
実際にやってみよう
では実際にターミナルで確認していきましょう。
まずは「git_tutorial」に移動して、今の状況を確認します。
まず「ls」でどんなファイルがあるか確認します。
$ ls index.html
「index.html」というファイルがあります。
では今のファイルの変更状況を確認してみます。
「git status」と入力します。
特に何も変更されているものはありません。
$ git status On branch master nothing to commit, working tree clean
ではここから「git rm」コマンドを使ってみます。
「git rm index.html」と入力します。
$ git rm index.html rm 'index.html'
すると「index.html」をリムーブしたよと表示されます。
では今のファイル状況はどのようになっているでしょうか。
まず「ls」してみます。
$ ls
何も表示されません。
ということはワークツリーから「index.html」が削除されたということになります。
次に「git status」で確認してみます。
$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: index.html
「Changes to be committed」、つまり、ステージに上げられている変更があるよと言われています。
それが「index.html」が「deleted」だよとなっています。
これはつまりどういうことかというと、もともとリポジトリに記録されていた「index.html」が削除されて、今その削除された変更状態がステージに記録されているということになります。
確かにワークツリーからもリポジトリからも削除されていることが確認できました。
それでは元の状態に戻しましょう。
元の状態に戻すためには「git reset HEAD index.html」と入力します。その後「git checkout index.html」と入力します。
このあたりのコマンドに関してはまた後ほど解説しますので、今はそのまま入力だけして、軽く流しておいてください。
$ git reset HEAD index.html Unstaged changes after reset: D index.html $ git checkout index.html Updated 1 path from the index
それでは今の状態をもう一度確認してみましょう。
「ls」します。
$ ls index.html
ファイルが復活しています。
「git status」も確認しておきます。
$ git status On branch master nothing to commit, working tree clean
何も変更点はないと言われています。
これで元の状態に復活しました。
それでは続いて「git rm --cached index.html」を実行してみましょう。
$ git rm --cached index.html rm 'index.html'
「index.html」が削除されたとなっています。
ではまず「ls」でワークツリーの状態を確認してみましょう。
$ ls index.html
「index.html」は存在しています。
ワークツリーからは消えていません。
では「git status」をするとどうでしょうか。
$ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: index.html Untracked files: (use "git add <file>..." to include in what will be committed) index.html
すると、コミットすべき変更には「index.html」は削除されているとあります。
つまり、リポジトリからは削除されていて、その変更状態がステージに追加されていると言う事になります。
一方で下の方に「Untracked files」で「index.html」があります。
これは何かというと、まだGitで追跡できていないファイルがある、つまり、「index.html」という新規ファイルがあるよと言われています。
これは何が起こっているのでしょうか。
これはリポジトリからだけファイルを削除したので、今Gitの状態としては「index.html」というのは記録されていない状態になっています。
でもワークツリーには「index.html」はあるので、これが新しいファイルがあるよと認識されています。
このように、「--cached」のオプションを付けると、リポジトリからだけファイルを削除することができました。
それでは元の状態にもどしましょう。
もう一度「git reset HEAD index.html」と入力します。
$ git reset HEAD index.html
「git status」しておきましょう。
$ git status On branch master nothing to commit, working tree clean
変更はないと言われています。
念のため「ls」もしておきましょう。
$ ls index.html
「index.html」があります。
これで元の状態に戻すことができました。
参考図書
独学で挫折しそうになったら、オンラインプログラミングスクール