よく分かってなかったので自分用にまとめた。
reset:過去のコミットまで戻るrevert:過去のコミットを取り消すコミットをする
reset
大きく分けて以下の3種類がある。
--soft・・・「HEAD」だけ戻す(commitだけ戻す)--mixed・・・「HEAD」と「インデックス」だけ戻す(commitとaddだけ戻す)--hard・・・「HEAD」と「インデックス」と「ワーキングツリー」を戻す(commitとaddとファイルの内容まで戻す)
何も指定しなかった場合は、--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する。
直前のコミットを取り消したい!という場合は、リビジョン番号で指定せずに
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のほうがいい。
おわり


コメント