git resetとgit revetについて
普段gitをバージョン管理に使っているのですが、git revert
とgit reset
についてまとめてみたいと思います。もし間違いなどがあったら指摘していただけると幸いです。
gitを使い始めてからつい最近までresetとrevertの違いは「resetは危険でrevertは安全!」みたいな感じで理解していました。
この理解のまま「今のバージョンから2つ前のバージョンに戻したい」という状況に出くわしたのですが、ここで$ git revert HEAD^^
とすると次の図のようになってしまいます。
図では単純ですが実際にやった時の結果は衝突しまくりで、結局最新のバージョンに戻してから手動で直したりしました。
これではせっかくgitを使っている意味が無いということで改めて調べてみた結果
revertは指定したコミットを無かったことにする
resetは(オプション次第ですが)指定したコミットに戻す
というものだとわかりました。
revertは先程の図の通り指定したコミットを無かったことにするので、「あの時のコミットで追加した機能にバグがあったからその機能だけを消したい」といった場合に使えます。
一方resetは「あの時の状態までソースコードを戻したい」と言った場合に使えます。
先ほどresetでオプション次第と書きましたが、resetで主に使うのは--hard
,--mixed
,--soft
の3つです。これらのオプションはそれぞれ
--hard
:HEADの位置・インデックス・ワーキングツリーのすべてを変更--mixed(オプション無しと同じ)
:HEADの位置・インデックスを変更--soft
:HEADの位置のみを変更
となっています。
--soft
を付けるとHEAD位置のみの変更なので影響は少ないですが、--hard
を付けると実際に作業しているファイルまで書き換わってしまうので--hard
オプションをつける場合にはより注意が必要ですね。