Gitコマンド

git reset

現在のブランチのHEADを指定した状態にリセットします。

git reset の概要

git reset には、大きく分けて、2つの機能があります。

  1. インデックスの状態をリセットする
  2. 現在のHEADを指定した状態に変更する

これらはコマンドの引数の指定の仕方によって変化します。また、両方を一度に行うこともあります。

[機能1] インデックスの状態のリセット

ひとつ目の機能は、主に、コミットする前に、インデックスの状態を調整する時に使います。

インデックスは、多くの場合、コミットを作成するためのファイルをステージに追加するコマンド「git add」によって変更されますが、その反対の操作として、変更されたインデックスの状態を修正する事ができます。

この操作のためには、git reset の引数に、なんらかの「ファイル名」や「パス」を指定します。これにより、現在のブランチの先頭である「HEAD」の状態をインデックスにコピーする事になります。

// 特定のファイルだけリセット
git reset /path/to/file.php

// ディレクトリ配下をすべてリセット
git reset /directory/

この操作によって、ブランチの状態や既存のコミットが影響をうけることはありません。また、作業ツリーも影響をうけず、そのままの状態です。

git resetはインデクスを修正

[機能2] 現在のHEADを指定した状態に変更する

2つ目の機能は、現在のブランチのHEADを強制的に書き換えるコマンドです。1つ目の機能より強い意味を持つコマンドです。

このためには、git reset の引数に、「コミット」を指定します。コミットの識別子SHA-1を指定しても構いせんし、下記のように、コミットへの参照である「ブランチ名」を記載することも多いでしょう。

// HEADを、HEADの直前のコミットにリセット
git commit HEAD^

// HEADを他のブランチの先頭のコミットにリセット
git commit another-branch

このコマンドにはいくつかのモードがあり、モードによって、影響範囲が変わります。モードの指定がなければデフォルトで「--mixed」モードとなります。

モード影響範囲
git reset --softHEAD(現在のブランチの先頭)だけをリセットします。
git reset
git reset --mixed
HEAD(現在のブランチの先頭)とインデックスをリセットします。作業ツリーはそのままです。
git reset --hardHEAD(現在のブランチの先頭)とインデックス、および作業ツリーをリセットします。

これらのモードは、よく利用するユースケースがあります。下記に2つの例を紹介します。

例1)ブランチの状態を強制的に別のブランチと一致させる

例えば、現在のブランチ「master」をリモートのmasterに強制一致させます。リモートのmasterの最新はgit fetchをした後に、origin/masterで参照できます。

HEAD、インデックス、作業ツリーをすべて、強制的にリセットします。

// ローカルのマスターをリモートのマスターに強制一致させる。
git fetch origin master
git reset --hard origin/master

もし作業ツリーやインデックスに作業途中の変更が残っていれば、すべて消去されてしまいますので、実行前に git statusで現在の状態を確認することをおすすめします。

例2)直前のコミットを修正する

例えば、直前に作成したコミットに修正を入れ忘れてしまった場合、--soft, --mixedで、直前のコミットを変更できます。

// (1) HEADの状態だけを、差し戻す
git reset --soft HEAD^ 

// (2) 追加修正をステージし、コミットし直す。
git add additional-update.php
git commit

もしインデックスをすべて作り直したければ、上記を--mixedで実行し、git add 操作によるステージングをすべてやり直せば良いのです。

git reset のオプション

Git公式ドキュメント

Git公式ドキュメント「git reset」へのリンクです。