Git 間違ってmasterにコミットした話

またやってしまった。Git 難しいー

今学習の一環としてRailsでアプリを作っていて、機能を追加するにあたりブランチを切って作業しているつもりが master のままで、masterブランチにコミットしてしまった。

$ git reset --hard で作業ツリーをコミットと同じ状態にして、$ git reset --soft HEAD^で HEAD を1つ前のコミットに戻してstash??とかいろいろ考えたが、ちょうど申し込んでいた勉強会(オンライン)の時間になったので、プロの方に相談させてもらった。多分すごい強い方なのにこんな質問して申し訳ない。。。とてもわかりやすく教えていただいた。Rubyコミュニティは初心者に優しくてほんとにありがたい。

やるべきことを整理

# 今の状態:間違ってmasterブランチにコミットした
master  A - B - C - D (masterの先端)

# この状態にしたい
master  A - B - C (masterの先端)
                 \
develop           D (developの先端)

つまり、やるべきことは次の3つ。

  1. master 先端コミットの1個前(HEAD^)からブランチを生やす
  2. master 先端のコミット(master)を新しいブランチの先端にくっつける(cherry-pick
  3. master 先端のコミットを削除

手順

# masterブランチに移動
$ git checkout master

# HEAD^ から新しいブランチ(develop)を生やしてそのブランチに移動
$ git checkout -b develop HEAD^

# masterブランチ先端のコミットをくっつける
$ git cherry-pick master

# masterブランチの先端のコミットを削除
$ git checkout master
$ git reset --hard HEAD^

これでOK。チェリーピックなのでコミットのハッシュは変わる。

Gitは何度も失敗して覚えていくしかないのかもしれない。