あるコードをトピックブランチにコミットしないといけないのに、間違えて main
(旧名 master
)ブランチに入れてしまった場合の修正方法です。
ここでは、main
ブランチに入れてしまった直近 2 つのコミットを、new-feature
というブランチに移動してみます。
まず、main ブランチのコミットログを確認しておきます。
$ git switch main
$ git log --oneline
3d40884 (HEAD -> main) Commit 4
daba4f2 Commit 3
256b4f0 Commit 2
696a835 (origin/main, origin/HEAD) Commit 1
一番上の Commit 4
が最新のコミットで、一番下の Commit 1
が GitHub などから pull してきたコミットであることがわかります。
Commit 2
から Commit 4
までは、ローカルだけでコミットされた(まだ push していない)ものなので、今回のような方法でコミット履歴を修正する余地があります。
ここでは、main
に入れてしまった Commit 3
と Commit 4
を別のブランチ (new-feature
) に移動させたい とします。
まず、現在の main
ブランチと同じ情報を持つ new-feature
ブランチを作成します。
$ git branch new-feature main
すでに new-feature
ブランチがある場合は、そちらへ main
ブランチの内容をマージします。
$ git switch new-feature
$ git merge main
これで、main
ブランチと同じ状態の new-feature
ブランチができました。
git log
コマンドで 2 つのブランチの内容が等しいことを確認しておきます。
$ git log --oneline --all
3d40884 (HEAD -> main, new-feature) Commit 4
daba4f2 Commit 3
256b4f0 Commit 2
696a835 (origin/main, origin/HEAD) Commit 1
前述の作業で、Commit 3
と Commit 4
は正しいブランチ (new-feature
) からたどれるようになったので、もう main
ブランチからは削除しても大丈夫です。
main
ブランチは Commit 2
まで入っているようにしたいので、次のようにしてコミットログを Commit 2
(ID=256b4f0) まで巻き戻します。
$ git switch main
$ git reset --hard 256b4f0
HEAD is now at 256b4f0 Commit 2
巻き戻し先のコミットは、HEAD~2
(2 つ前のコミット)という形で指定することもできますが、上記のように具体的なコミット ID を指定した方がわかりやすいです。
これで、main
ブランチには Commit 2
まで、new-feature
ブランチには Commit 4
まで入っている状態(目指していた状態)になりました。
$ git log --oneline --all
3d40884 (new-feature) Commit 4
daba4f2 Commit 3
256b4f0 (HEAD -> main) Commit 2
696a835 (origin/main, origin/HEAD) Commit 1