git resetとは?「オプション」や「使い方」などを図を用いて解説!

この記事では『git resetコマンド』について、

  • git resetとは
  • git resetのオプション
  • git reset --soft
    • git commitを取り消すコマンド
      • git reset --soft HEAD~
  • git reset --mixed
    • git addを取り消すコマンド(git commit実行前)
      • git reset --mixed HEAD
    • git commitgit addを取り消すコマンド
      • git reset --mixed HEAD~
  • git reset --hard
    • ファイルの変更とgit addを取り消すコマンド(git commit実行前)
      • git reset --hard HEAD
    • ファイルの変更、git commitgit addを取り消すコマンド
      • git reset --hard HEAD~
    • 昔のコミット時点の動作確認をするためのコマンド
      • git reset --hard commit_hash

などを図を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

git resetとは

git resetはその名の通りリセット(取り消し)をするコマンドです。主に以下の3つの目的で使用されます。

  • git commitの取り消し
  • git addの取り消し
  • 変更したファイルの取り消し

git resetのオプション

git resetには主に--hard--mixed--softの3つのオプションがあります。それぞれのオプションにおいて、変更を取り消す範囲を以下に示します。

  • --hard
    • git commitgit add、ファイルの変更の全てを取り消します。
    • HEAD、インデックス、ワーキングツリーの位置すべてが変更されます。
  • --mixed(またはオプション無し)
    • git commitgit addを取り消します。ファイルの変更は取り消しません。
    • HEADとインデックスの位置が変更されます。ワーキングツリーの位置はそのままです。
  • --soft
    • git commitのみを取り消します。git addとファイルの変更は取り消しません。
    • HEADの位置のみが変更されます。インデックスとワーキングツリーの位置はそのままです。

HEADとインデックスとワーキングツリーについて

  • HEAD
    • 自分が作業をしているブランチの位置です。ブランチの先頭のコミットを指していることが多いです。
  • インデックス
    • ローカルリポジトリにコミットするファイルを置いておくエリアです。
    • 「ステージングエリア」とも呼ばれています。
  • ワーキングツリー
    • ユーザーが作業中のフォルダです。
    • 「ワークツリー」、「ワークディレクトリ」、「作業ディレクトリ」とも呼ばれています。

git resetのオプションは他にもあります。詳しくはgit reset -hを実行して確認してください。よく使用するのは--hard--mixed--softです。

これらのオプションを図で説明します。現在のファイルの状態をYとしましょう。

git resetのオプション01

ワーキングツリーインデックスHEADの位置は以下の動作を行うことで変更します。

  • ワーキングツリーの位置
    • ファイルを変更したらワーキングツリーの位置が変更します。
  • インデックスの位置
    • git addしたらインデックスの位置が変更します。
  • HEADの位置
    • git commitしたらHEADの位置が変更します。
git resetのオプション02

上図に示すようにファイルの変更、git addgit commitしてファイルの状態がZに移ったとします。この時、以下のgit resetコマンドを実行すれば、これらの変更を取り消すことができます。

  • git reset --hard HEAD~
    • HEADインデックスワーキングツリーの位置すべてをYに戻す。
  • git reset --mixed HEAD~
    • HEADインデックスの位置をYに戻す。
  • git reset --soft HEAD~
    • HEADの位置のみをYに戻す。
git resetのオプション03

ではこれから、git resetの各オプションについて順番に詳しく説明していきます。

git reset --soft

--softオプションはHEADの位置のみを変更するオプションです。git commitのみ取り消したい場合に、--softオプションを用います。

インデックスやワーキングツリーには影響がないので、ファイルの変更は残ります。

git reset --softに関連するコマンドをこれから説明します。

git commitを取り消すコマンド

git reset --soft HEAD~
git reset --soft HEAD~
#以下のコマンドでも可能
git reset --soft HEAD~1
git reset --soft HEAD^
git reset --soft @~
git reset --soft @~1
git reset --soft @^

上記のコマンドを実行すると、「git commitする直前」の状態に戻ります。まだ作業をしているのに間違えてコミットしてしまった場合に使用します。

git reset --soft HEAD~は「HEADの位置」を「直前のコミットHEAD~の位置」にリセットするという意味になります。

補足

コミットメッセージを間違えた場合には、以下のコマンドを実行したほうが楽なのでおすすめです。

git commit --amend -m "変更後のコメントメッセージ"

git reset --mixed

--mixedオプションはHEADとインデックスの位置を変更するオプションです。git addgit commitを取り消したい場合に、--mixedオプションを用います。git resetでオプションを指定しないときのデフォルトです。

ワーキングツリーには影響がないので、ファイルの変更は残ります。

git reset --mixedに関連するコマンドをこれから説明します。

git addを取り消すコマンド(git commit実行前)

git reset --mixed HEAD
git reset --mixed HEAD
#以下のコマンドでも可能
git reset HEAD

上記のコマンドを実行すると、git addを取り消すことができます。

git reset --mixed HEADは「HEADとインデックスの位置」を「HEADの位置(最後にコミットした位置)」にリセットするという意味になります。

git commitとgit addを取り消すコマンド

git reset --mixed HEAD~
git reset --mixed HEAD~
#以下のコマンドでも可能
git reset --mixed HEAD~1
git reset --mixed HEAD^
git reset --mixed @~
git reset --mixed @~1
git reset --mixed @^
git reset HEAD~
git reset HEAD~1
git reset HEAD^
git reset @~
git reset @~1
git reset @^

上記のコマンドを実行すると、「git addgit commitをする直前」の状態に戻ります。間違えてgit addgit commitを実行して、コミットしてしまった場合に使用します。

git reset --mixed HEAD~は「HEADとインデックスの位置」を「直前のコミットHEAD~の位置」にリセットするという意味になります。

git reset --hard

--hardオプションはHEAD、インデックス、ワーキングツリーの位置を変更するオプションです。

ワーキングツリーの変更も削除するため、慎重に使用してください。--hardオプションを用いると、基本的にはすべて消えます。

git reset --hardに関連するコマンドをこれから説明します。

ファイルの変更とgit addを取り消すコマンド(git commit実行前

git reset --hard HEAD
git reset --hard HEAD

コミット後、いろいろ作業したが、それらの変更を全て取り消したい場合には、上記のコマンドを実行します。上記のコマンドを実行すると、ファイルの変更やgit addを取り消すことができます。

git reset --hard HEADは「HEADとインデックスとワーキングツリーの位置」を「HEADの位置(最後にコミットした位置)」にリセットするという意味になります。

ファイルの変更、git commit、git addを取り消すコマンド

git reset --hard HEAD~
git reset --hard HEAD~
#以下のコマンドでも可能
git reset --hard HEAD~1
git reset --hard HEAD^
git reset --hard @~
git reset --hard @~1
git reset --hard @^

直前のコミットを丸ごと削除したい場合には、上記のコマンドを実行します。上記のコマンドを実行すると、ファイルの変更、git addgit commitを取り消すことができます。

コミットした内容がワーキングツリーに残す必要すらないほど余計なものだった場合に使用します。

git reset --hard HEAD~は「HEADとインデックスとワーキングツリーの位置」を「直前のコミットHEAD~の位置」にリセットするという意味になります。

昔のコミット時点の動作確認をするためのコマンド

git reset --hard commit_hash
git reset --hard <commit_hash>

コミット値を指定すると、指定した時点までHEAD、インデックス、ワーキングツリーの位置を戻すことができます。

ただ、昔のコミット時点の動作確認をしたい場合には、以下のコマンドを実行して、動作確認したい位置にチェックアウトする方が安全です。

git checkout-b <commit_hash>

補足

該当コミットのハッシュ値はgit refloggit logから調べることができます。

本記事のまとめ

この記事では『git resetコマンド』について、以下の内容を説明しました。

  • git resetとは
  • git resetのオプション
  • git reset --soft
    • git commitを取り消すコマンド
      • git reset --soft HEAD~
  • git reset --mixed
    • git addを取り消すコマンド(git commit実行前)
      • git reset --mixed HEAD
    • git commitgit addを取り消すコマンド
      • git reset --mixed HEAD~
  • git reset --hard
    • ファイルの変更とgit addを取り消すコマンド(git commit実行前)
      • git reset --hard HEAD
    • ファイルの変更、git commitgit addを取り消すコマンド
      • git reset --hard HEAD~
    • 昔のコミット時点の動作確認をするためのコマンド
      • git reset --hard commit_hash

お読み頂きありがとうございました。