reset,revertの違い【Git】

よく分かってなかったので自分用にまとめた。

  • reset:過去のコミットまで戻る
  • revert:過去のコミットを取り消すコミットをする

reset

大きく分けて以下の3種類がある。

  • --soft・・・「HEAD」だけ戻す(commitだけ戻す)
  • --mixed・・・「HEAD」と「インデックス」だけ戻す(commitaddだけ戻す)
  • --hard・・・「HEAD」と「インデックス」と「ワーキングツリー」を戻す(commitaddとファイルの内容まで戻す)

何も指定しなかった場合は、--mixedが指定される。

例えば、以下のような状態だったとして

この状態で

git reset --soft 3のリビジョン番号

git reset --mixed 3のリビジョン番号

git reset --hard 3のリビジョン番号

とやると、それぞれ以下のようになる。

▲–soft ▲–mixed ▲–hard

softで戻った場合は、commitするだけでいい。

mixedで戻った場合は、addしてcommitする。

hardで戻った場合は、ファイルまで全て戻ってしまっているので1から開発し直す。そして開発が終わったらaddしてcommitする。

例えるなら

  • 1:起きた
  • 2:朝食を食べた
  • 3:昼食を食べた
  • 4:うんこをした

という場合、4から3まで戻るとき

  • hard:うんこをする前に戻る
  • mixed:うんこをした直後に戻る
  • soft:「うんこをした記録をしよう」とインデックスに上げた状態まで戻る

みたいな感じ。

mixedとsoftはかなり似てる。ぶっちゃけどっちでも大差ない。「うんこをした」という事実は変わらないから。

hardはかなり違う。うんこをしなかったことにできるから。

 

直前のコミットを取り消したい!という場合は、リビジョン番号で指定せずに

git reset --hard HEAD^

と書くと、1つ前のコミットまで戻れる。

  • HEAD^^と書くと2つ前まで戻れる
  • HEAD^^^と書くと3つ前まで戻れる

revert

例えば先ほどの例で考えると

  • 1:起きた
  • 2:朝食を食べた
  • 3:昼食を食べた
  • 4:うんこをした

みたいな場合に「うんこをしなかったことにしたい!」という場合は、

git revert 4のリビジョン番号

みたいに書くと、新たに「うんこをしなかった」というコミットが加わる。

つまり、以下のようにできる。

  • 1:起きた
  • 2:朝食を食べた
  • 3:昼食を食べた
  • 4:うんこをした
  • 5:うんこをしなかった

こうすることで、うんこをしなかったことになる。

チーム開発の場合は「やべ、間違ってcommit&pushしちゃった」みたいな場合に、resetで「なかったことにするぜ」をやると、整合性が取れなくなるかもしれないので、revertを使った方が良い。(pushはしていなくてcommitだけならresetで大丈夫だけど)

例えるなら、Aという教科書で歴史を学んでいたのに、いつの間にかAが改変されていたら、Aで勉強中の人は間違ったまま記憶してしまう。なので「Aの歴史は間違ってました」みたいに書いておく。そうすることで改変前のAを見たあとに改変後のAを見た人は「あ、この部分間違ってたのね」と気付ける。逆にAの教科書がまだ配布されていない場合はresetでこっそり修正できる。・・・みたいな感じ。

revertするとコミットログが見づらくなってしまうので、resetしても大丈夫そうな状況ならresetのほうがいい。

おわり

Git
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました