Gitを使った分散開発管理6 – resetの詳細

2011.07.17

resetの動作を確認する

前回、resetはいろいろな変更が可能だと最後に書きました。具体的には

  • HEADの位置を変更する
  • インデックスを変更する(add取り消し)
  • 作業ツリーを変更する(add後の変更の取り消し)

のような操作が可能です。
では図を見ながらresetの動作を確認していきましょう。

まずは初期状態です。Aは前回のコミット直後の状態、Bは今回(HEAD)のコミット直後の状態を示しています。
そして、HEAD、インデックス、作業ツリーもすべてBを指しています。

hello.htmlを内容を修正しました。
作業ツリーが新たな状態Cへ移動していますが、ほかはそのままです。


hello.htmlをaddしてステージングしました。

$ git add hello.html

当然、インデックスも作業ツリーと同じ位置を指します。
このあと作業ツリーを変更すれば、またインデックスと違う状態に移行します。


では、resetを使用していろいろ操作してみましょう。 まずは、作業ツリーとインデックスをHEAD位置まで戻します。
変更をステージングまでしていたがコミット寸前でなんらかの事情で全部もとに戻す、というようなケースで使用します。

$ git reset --hard HEAD

--hardオプションは、HEAD、インデックス、作業ツリー、すべてに影響を及ぼします。
例えば今回、git reset --hard HEAD^としていれば、すべてAを指すことになります。

では次は、インデックスの変更をしてみましょう。git reset --mixed、または指定なしで行います。
これはインデックスおよびHEADの変更になります。 作業スペースには影響はありません。
再びhello.htmlに変更を加え、ファイルをaddして図のインデックス更新状態にしたあと、resetを実行します。

$ git reset --mixed HEAD

作業ツリーの変更はそのままで、addが取り消されています。
先程と同じく、git reset --mixed HEAD^としていれば、インデックスとHEADはAを指すことになります。

最後に、HEADのみの変更を行ってみましょう。
その前に、git reset --hard HEADを実行して、初期状態にした後、ファイルの更新とaddを行ってください。
そして、resetを実行します。

$ git reset --soft HEAD^

HEADを指定しても何もかわらないので、HEAD^を指定して、HEADの位置をAに移動しています。
インデックスと作業ツリーには影響はありません。

HEADを元の位置に戻したい場合、ORIG_HEADという名前で参照できるので、

$ git reset --soft ORIG_HEAD

とすれば元に戻すことができます。

今回はresetのいろいろな使い方を説明しました。
これを使えば自由自在にHEAD,インデックス、作業ツリーを移動できますね。
revertとresetは似たところもありますが、それぞれ用途が違うのでうまく使い分けてください。
次回はブランチとタグについて解説します。