トグルンの趣味ブログ

趣味(プログラミング、アニメ等)について気まぐれに書くつもりですが、それ以外も自由に書きます

git resetとgit revetについて

普段gitをバージョン管理に使っているのですが、git revertgit resetについてまとめてみたいと思います。もし間違いなどがあったら指摘していただけると幸いです。

 gitを使い始めてからつい最近までresetとrevertの違いは「resetは危険でrevertは安全!」みたいな感じで理解していました。
f:id:togurunn:20150829021511j:plain:w300
この理解のまま「今のバージョンから2つ前のバージョンに戻したい」という状況に出くわしたのですが、ここで$ git revert HEAD^^とすると次の図のようになってしまいます。
f:id:togurunn:20150829022134j:plain:w400

図では単純ですが実際にやった時の結果は衝突しまくりで、結局最新のバージョンに戻してから手動で直したりしました。

これではせっかくgitを使っている意味が無いということで改めて調べてみた結果

revertは指定したコミットを無かったことにする
resetは(オプション次第ですが)指定したコミットに戻す

というものだとわかりました。
revertは先程の図の通り指定したコミットを無かったことにするので、「あの時のコミットで追加した機能にバグがあったからその機能だけを消したい」といった場合に使えます。
一方resetは「あの時の状態までソースコードを戻したい」と言った場合に使えます。
f:id:togurunn:20150829021604j:plain:w300

先ほどresetでオプション次第と書きましたが、resetで主に使うのは--hard,--mixed,--softの3つです。これらのオプションはそれぞれ

  • --hard:HEADの位置・インデックス・ワーキングツリーのすべてを変更
  • --mixed(オプション無しと同じ):HEADの位置・インデックスを変更
  • --soft:HEADの位置のみを変更
    となっています。

--softを付けるとHEAD位置のみの変更なので影響は少ないですが、--hardを付けると実際に作業しているファイルまで書き換わってしまうので--hardオプションをつける場合にはより注意が必要ですね。