未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Git&GitHub】ファイルの削除を記録(git rmコマンド)

title


ファイルの削除を記録しよう

今回はファイルの削除を記録するやり方を見ていきます。


ファイルの削除を記録するには、「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」があります。

これで元の状態に戻すことができました。


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work