よく分かってなかったので自分用にまとめた。
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
のほうがいい。
おわり
コメント