Hatena::ブログ(Diary)

murankの日記

2011-03-27

git reset についてもまとめてみる

| 20:19

前回 git diff を図に書いてみたところ、自分の中で意外と整理できたので、これまたなんとなく使っていた git reset についてもまとめてみた。


とりあえず結論を先にまとめよう。

git reset とは?

HEAD の位置を変更するコマンド。

オプションによってインデックス、ワーキングツリーの内容も変更できる。


git reset のオプションは?

--soft、--mixed(オプションなしと同等)、--hard オプションがあり、影響度の小さい順に以下のようになる。

  • --soft
    • HEAD の位置のみを変更する。インデックス、ワーキングツリーには影響なし。
  • --mixed (またはオプションなし)
    • HEAD の位置とインデックスを変更する。ワーキングツリーには影響なし。
  • --hard
    • HEADの位置、インデックス、ワーキングツリーをすべて変更する。


さて、git reset の説明に入る前に一旦 HEAD、インデックス、ワーキングツリーの関係について整理しておく。


初期状態

前回のコミットが完了してからまだ何も修正していない状態。

インデックスの内容もワーキングツリーの内容も HEAD に一致している。


f:id:murank:20110320180128p:image


ファイル修正

ファイルを修正したため、ワーキングツリーの内容はHEADとは異なるようになる。

ただ、まだ git add していないため、インデックスの内容は HEAD と同じまま。


f:id:murank:20110320180216p:image


git add

git add するとインデックスに現在のワーキングツリーの状態が反映される。


f:id:murank:20110320180521p:image


さらにファイル修正

git add した後にもファイルの修正をしても別に問題ない。

この場合、下の図のように HEAD、インデックス、ワーキングツリーの内容はすべて異なるようになる。


f:id:murank:20110320180608p:image



この状態から git reset を行ったらどうなるかを見ていこう。

git reset --soft HEAD

HEAD の位置を HEAD に変更し、インデックス、ワーキングツリーはそのままにする。

つまり何も変わらない。


f:id:murank:20110320180608p:image


git reset --soft HEAD^

HEAD の位置が HEAD^ に移動するだけ。

前の HEAD にアクセスできなくなる!?と思うかもしれないけど、ORIG_HEAD や git-reflog でいくらでも元に戻せるので心配無用。


f:id:murank:20110320180708p:image


git reset HEAD

HEAD、インデックスを HEAD に変更する。ワーキングツリーはそのまま。

これを実行すると変更前のインデックスにはアクセスできなくなるので要注意。*1

git add を取り消す方法としてよく使われる。


f:id:murank:20110320180859p:image


git reset HEAD^

今度はワーキングツリーの変更を残しつつ、HEAD、インデックスを HEAD^ に変更する。

これも変更前のインデックスの内容は失われる。*2


f:id:murank:20110320180947p:image


git reset --hard HEAD

HEAD、インデックス、ワーキングツリーすべてを HEAD に変更する。

変更前のHEAD、インデックスは復元する方法があるが、ワーキングツリーの内容は完全に失われるので要注意。


f:id:murank:20110320181004p:image


git reset --hard HEAD^

HEAD、インデックス、ワーキングツリーすべてを HEAD^ に変更する。


f:id:murank:20110320181040p:image



--merge、--keep というオプションもあるみたいだけど、この 3 種類さえ使えれば 99% 事足りる気がする。

後は、自分が HEAD +何の内容を変更したいかさえ意識すれば git reset は使いこなせると思う。

*1:git-gc する前なら git-fsck でなんとか辿りつけるらしい。詳しくは知らない

*2:git-fsck で頑張れば(ry

t98907t98907 2011/07/21 22:19 図のおかげで分かりやすかったです!

tamertamer 2011/09/16 12:28 これは分かりやすくていいですね
チームで初めてgitを使う場合などの説明資料としてありがたいです。

ひろせひろせ 2011/12/07 12:01 これはわかりやすいです。ありがとうございます。

akiradeveloperakiradeveloper 2012/03/25 13:32 とても分かりよかったです!素晴らしい!

KenjiKenji 2012/10/07 16:40 すごく解りやすくてびっくりしました。
git resetとgit revertの記事をいろいろ探していたのですが、
他の記事と比較しても、正直、同じgit resetについて書かれた記事とは
思えない程、解りやすかったです。
そこで・・・、もしお時間がありましたら、そして気が向きましたら、
git revert、git reflogについてもいつか記事を書いて下さると嬉しいです(^^;

clojureclojure 2013/01/18 10:58 本当にわかりやすかったです。ありがとうございます。