ししちにじゅうはち 4x7=28

よんたったー https://twitter.com/keita44_f4

俺がgithubを使うにあたってgitを理解しようとした話3

そもそもなんでgitを理解せねば、というかこんなトラブルをことが起きてしまったのか、というお話。

何をしようとしていたか

https://github.com/smlsharp/smlsharp:githubのSML#レポジトリ]のバージョンが1.1.0だったので1.2.0と2.0.0にアップデートしようとしてました。

理想はこんな感じ。

何をやらかしたか

バージョン1.2.0のアップデートは素直にいき、githubへ反映できました。
しかしその次が問題。
間違えて2.0.0の変更を1.1.0にかけてしまい、手元のmasterがリモートのmaster(oring/master)と別ブランチ状態に。
詳細は、いらないファイルを消し忘れたり、README.mdを消してしまったりをして、何度かやり直してパニックになっているうちに、こんな間違ったpush状態に陥っていました。

解決法

解決方法はいろいろありますが、今回は手元のmasterをresetしてv1.2.0に指し直してから、2.0.0をコミットしました。*1
図とコマンドは下記。
ちなみにこの時の自分ではどうしていいかわからずに*2、mzpさんとbleisさんにご指導を仰ぎました。
結果としてgitについていろいろ知ることになりました。

$ git reset --hard v1.2.0   # masterのHEADとファイル内容をv1.2.0へセット


あとはv2.0.0をコミットしなおせば目的のコミットツリーのできあがり。
ちゃんちゃん。

反省

  • gitはコマンドのコピペじゃなくて中身を理解してつかう
    • たいていは痛い目を見てから覚える
  • git reset --hardはファイル内容も書き換えるので慎重に
  • rebase -iでHEADが指してるコミットは消せないっぽい
    • gitのコミットはrebase等で消しても見えなくなるだけで、タグ・ブランチなどで差されていないとそのうちGCされて本当に消えるらしい

*1:わけもわからずmzpの言うとおりにしたらうまくいった、mzpすごいなー!

*2:rebase -i HEAD^^で間違ったv2.0.0を消そうとして消せなくて悩んでました。今思うと、masterのHEADが指してるところを消せるわけがないですね。