誤ったブランチにコミットしてしまったコミットを正しいブランチにコミットし直す方法
僕ぐらいかもしれないのですが, 本来別のブランチを作ってそこにコミットしていくはずが, ブランチを作り忘れて master ブランチにそのままコミットしてしまうということが時々あります. そのようにブランチを作り忘れてしまった時の解決策を紹介します.
master
ブランチと feature
ブランチを例に, 本来 feature
ブランチを作ってコミットしていくつもりが, master
ブランチにそのままコミットしてしまって, どうやってそのコミットを feature
ブランチにコミットし直すかということで, その解決策を紹介させていただきたいと思います.
次のように A
, B
, C
, D
と master
ブランチにコミットしてきたとします:
A --- B --- C --- D <- master <- HEAD
ただ本当はコミット B
から分岐させた feature
ブランチを作って, C
, D
を feature
ブランチのコミットにしたかったとします:
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
すると当初望んでいた通りのコミットヒストリに直すことができます:
C --- D <- feature
/
/
A --- B <- master <- HEAD
後は feature
ブランチにコミットをしていく場合は, 今度は忘れずに git checkout feature
で feature
ブランチをチェックアウトしてからコミットしていくようにすれば ok です. (自分への戒め)
関連記事
git reset --soft, --mixed, --hard の違い2018.05.29
git rebase でヒストリを直線的にする方法と使う時の注意点2018.08.13
Git の Reset, Checkout, Revert の違い2018.06.01
誤ってリベースしてしまった Git のコミットを元に戻す方法2018.05.25
Git の Pull コマンドの使い方2018.06.07