未来エンジニア養成所Blog

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

【Git&GitHub】ステージした変更を取り消す(git restore --stagedコマンド)

title


ステージした変更を取り消そう

今回はステージした変更を取り消す方法について見ていきます。


どういう時に使うかというと、ステージに追加したけど、その変更を元に戻したいといった時に使います。

ファイルを変更して「git add」でステージに追加したけど、その追加分が誤っていた。

ステージに追加してしまったけど、やはり追加したくないので元に戻したい。

そのような時の方法についてです。


では、ステージした変更を取り消すコマンドについて見ていきます。


そのコマンドは「git restore --staged」コマンドを使います。

$ git restore --staged <ファイル名>
$ git restore --staged <ディレクトリ名>

# 全変更を取り消す
$ git restore --staged .


あるファイルをステージから取り消したい時は「git restore --staged <ファイル名>」、ディレクトリごと取り消したい時は「git restore --staged <ディレクトリ名>」と入力します。

もしステージした変更を全部取り消したい場合は「git restore --staged .」と入力します。

これらのコマンドを使うことで、ステージに追加したり、変更を取り消すことができます。

1点、注意点としてこのコマンドは変更ステージから取り消すだけなので、ワークツリーのファイル、つまり自分のローカルのファイルそのものには影響を与えない、変更は取り消されないことを気をつけておいてください。


もし、ワークツリーのファイルの変更を取り消したい場合は、「git restore」のみのコマンドになります。


では、イメージで押さえておきましょう。


今、ワークツリーに変更を加えて、「git add」でステージに追加した状態だとします。

このステージに追加した変更を「git restore --staged」コマンドで取り消します。

ここで注意して欲しいのは「git restore --staged」コマンドではステージした変更分だけが取り消されていて、ワークツリーの変更には何の影響も与えていないと言う事を改めて図で押さえておいてください。


ステージした変更を取り消す


この「git restore --staged」コマンドの裏側で何が起こっているかというと、リポジトリから最新のコミットの情報を取ってきて、その情報でステージの内容を上書きすると言う事をしています。

最新のコミット、つまり直前のコミットです。

その内容でステージの内容を上書きすることで、ステージに追加した変更分というのを取り消しています。


ステージした変更を取り消す


実際にやってみよう

ではターミナルを立ち上げて実際にやってみましょう。

まずエディタを立ち上げて「index.html」を編集していきます。

今回は「<p>git reset</p>」と追記してみましょう。


保存したらターミナルに戻ります。

では今の状況を確認してみましょう。

「git status」と入力します。

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")


「index.html」が変更されたと表示されています。今回はその変更内容を確認してみます。

「git diff」と入力します。

$ git diff
diff --git a/index.html b/index.html
index 47028db..96e6e77 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
 <h1>Gitチュートリアル</h1>
 <p>git status</p>
 <p>git diff</p>
+<p>git reset</p>

すると「<p>git reset</p>」と追記されているのが分かります。

まずこの変更をステージに追加しましょう。

「git add .」と入力します。

もう一度「git status」で状況を確認してみます。

$ git add .

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   index.html

すると今度は「Changes to be committed」、つまりコミットすべき変更があると表示されています。

それが「index.html」ということになります。


ちゃんとステージに追加されていることが確認できました。


ではこの内容を「git restore --staged」コマンドで取り消していきます。


ここで「git status」コマンドを見てください。

注意文のところで「use "git restore --staged ..." to unstage」と書いてあります。

実は「git status」コマンドは親切なコマンドで、ステージから取り消したい場合は「git reset」コマンドを使ってねと教えてくれています。

ですので、もし「git reset」コマンドのことを忘れてしまっても「git status」を入力すれば、やり方が表示されるので、それを見て思い出すことができます。


では、実際にリセットしてみましょう。


「git restore --staged index.html」と入力します。

$ git restore --staged index.html


ではもう一度「git status」で状況を確認しておきましょう。

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")


すると「Chages not staged for commit」と表示されます。

つまり、ワークツリーの変更でまだステージしていない変更があると表示されています。

ここからステージの変更は取り消されたけれど、ワークツリーの変更はそのままだということがわかります。

ワークツリーの内容も確認しておきましょう。


エディタを立ち上げて「index.html」の中身を見てみます。

「<p>git reset</p>」という書き込みが残ったままのはずです。

ワークツリーの内容に変更無いことがわかります。


ターミナルに戻り、最後にワークツリーへの変更分も取り消しておきます。


「git status」コマンドの出力結果を見るとやり方が表示されていて、「use "git restore ..." to discard changes in working directory」と表示されています。

これはワークツリーの変更を取り消したい場合、「git restore 」を実行してと表示されています。


では「git restore」コマンドで変更を取り消しましょう。

$ git restore index.html


これで変更が無かったことになりました。

もう一度「git status」を確認しておきます。

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean


確かに何も変更が無い状態に戻すことができました。

このように何かファイルを変更した時、その変更を取り消したいと言う時はステージからの変更の取消に関しては「git restore --staged」コマンド、ワークツリーの変更を取り消したいという場合は「git restore」コマンドを使います。


参考図書



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



あわせて学習したい

phoeducation.work