未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【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