Gitでブランチを切るのを忘れて間違えてmasterにコミットしてしまったときの対処法

誤ってmasterブランチでコミットしてしまっても、そのコミットの変更内容を別のブランチに移すことで対処できます

① どこのコミットまで変更内容を移したいのか確認する

# masterブランチのコミット履歴を1行で表示させます
$ git log --oneline master
813c118 (HEAD -> master) Add:  # 移動したい変更3
a7ba267 Add: 〇〇〇〇 # 移動したい変更2
3dfd56a Add: 〇〇〇〇 # 移動したい変更1
7dd0b34 (origin/master) Merge pull request 
2a3701c (origin/development) 
ede71f6 Add:〇〇〇〇
8a05884 Add: 〇〇〇〇
a1f10f4 first-commit

上記より、7dd0b34から上の3つのコミットが誤ってコミットしてしまった部分だと分かります。

② 変更の移動先となるブランチがまだ作成されていない場合は、移動先となるブランチを作成します

# ブランチ名を作成し移動
$ git checkout -b ブランチ名

# ブランチ一覧表示と今いるブランチの確認
$ git branch

git reset --hardコマンドでmasterブランチから移動したい変更のコミットを削除します

今回は、3つのコミットを移動させたいので、masterブランチから最新の3つ分のコミット履歴を削除します。ただし、git reset --hardを使う場合は、プッシュ前のコミットに対してのみ、使うようにしましょう。

  • HEADは、今自分がいるブランチの先頭のことで、自分が作業している場所を示すポインタです。
# masterブランチにいることを確認する
$ git branch
* master
  posts

# masterブランチで、git reset --hardを使います。
# masterブランチの指定した時点まで「HEAD(今自分がいるブランチの先頭)・ステージングエリア・作業ディレクトリ」のすべてが巻き戻されます。(今回は3つ前まで)
$ git reset --hard HEAD~3
HEAD is now at 7dd0b34 Merge pull request #1 from name/development

# masterブランチのコミット履歴を1行で表示
$ git log --oneline master 
7dd0b34 (HEAD -> master, origin/master) Merge pull request 
2a3701c (origin/development) Add:〇〇〇〇
ede71f6 Add:〇〇〇〇
8a05884 Add: 〇〇〇〇
a1f10f4 first-commit

これで、今いるmasterブランチの先頭がリモートリポジトリの内容をプルした部分まで巻き戻りました。

④ 移動したいブランチで作業の続きを行います

masterブランチのコミットは削除しましたが、移動したブランチ内ではコミット履歴が残っていることが確認できました。

# masterからpostブランチへ移動
$ git checkout posts

# ブランチ確認
$ git branch
* master
  posts

# postsブランチのコミット履歴を表示
$ git log --oneline posts 
813c118 (HEAD -> posts) Add: 〇〇〇〇 # 移動した変更3
a7ba267 Add: 〇〇〇〇 # 移動した変更2
3dfd56a Add: 〇〇〇〇 # 移動した変更1
7dd0b34 (origin/master, master) Merge pull request 
2a3701c (origin/development) Add:〇〇〇〇
ede71f6 Add:〇〇〇〇
8a05884 Add: 〇〇〇〇
a1f10f4 first-commit

参考

[Git]誤ったブランチで実施した変更を正しいブランチに移動する | DevelopersIO

第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~ - itstaffing エンジニアスタイル