誤ったブランチにコミットしてしまったコミットを正しいブランチにコミットし直す方法


僕ぐらいかもしれないのですが, 本来別のブランチを作ってそこにコミットしていくはずが, ブランチを作り忘れて master ブランチにそのままコミットしてしまうということが時々あります. そのようにブランチを作り忘れてしまった時の解決策を紹介します.

master ブランチと feature ブランチを例に, 本来 feature ブランチを作ってコミットしていくつもりが, master ブランチにそのままコミットしてしまって, どうやってそのコミットを feature ブランチにコミットし直すかということで, その解決策を紹介させていただきたいと思います.

次のように A, B, C, Dmaster ブランチにコミットしてきたとします:

    A --- B --- C --- D <- master <- HEAD

ただ本当はコミット B から分岐させた feature ブランチを作って, C, Dfeature ブランチのコミットにしたかったとします:

             C --- D <- feature <- HEAD
            /
           /
    A --- B <- master

その場合, 今現在のコミットヒストリは次のようになっているので:

    A --- B --- C --- D <- master <- HEAD

まず次のコマンドで master ブランチのコピー feature ブランチを作ってしまいます:

git checkout -b feature

すると次のようになるので:

    A --- B --- C --- D <- (HEAD -> feature, master)

次のコマンドで master ブランチをチェックアウトして master ブランチに戻ります:

git checkout master

すると次のようになります:

    A --- B --- C --- D <- (HEAD -> master, feature)

そして次のコマンドで master ブランチのコミットを B までハードリセットして C, D のコミットを破棄してなかったことにしてしまいます:

git reset --hard HEAD~2

すると当初望んでいた通りのコミットヒストリに直すことができますrelieved:

             C --- D <- feature
            /
           /
    A --- B <- master <- HEAD

後は feature ブランチにコミットをしていく場合は, 今度は忘れずに git checkout featurefeature ブランチをチェックアウトしてからコミットしていくようにすれば ok です. (自分への戒め)