本日も乙

ただの自己満足な備忘録。

Masterブランチに誤ってcommitしてpushした場合の対応

[toc]

Git力が低い僕です。 ブランチ切ってPushしたつもりが、MasterブランチにコミットしてPushしてしまった場合の対処方法をメモとして残しておきます。
Git力低い(2回目)ので、もっと効率の良いやり方があるかと思いますが、コメントなどで指摘していただけると嬉しいです。

3つコミットしてすでにGitHubにPushしてしまったとします。

$  git branch| grep "*"
* master

$ git log --oneline
96b6e0f 変更C
cb5efb9 変更B
1b32926 変更A

3つ前の状態に戻す

git reset --hard でHEAD、インデックス、ワーキングツリーすべてを戻します。

[memo]
HEAD ・・・ 現在の最新コミットの状態
インデックス ・・・ コミットするためのファイルの状態
ワーキングツリー ・・・ 最新のファイルの状態

ワーキングツリー - [add] -> インデックス - [commit] -> ローカルリポジトリ - [push] -> リモートリポジトリ
$ git reset --hard HEAD~3

ブランチの作成

すでにある場合は git checkout でブランチを切替えます。
ブランチ名を fix_hoge とします。

$ git checkout -b fix_hoge

Cherry-pickでコミットを移す

下のコミットから順に移していきます。

$ git cherry-pick 1b32926
$ git cherry-pick cb5efb9
$ git cherry-pick 96b6e0f
$ git push origin fix_hoge

リモートリポジトリのMasterブランチを元に戻す

push --force すれば、リモートリポジトリ側に強制的に反映されます。
他の人が作業している場合は、予め push --force することを伝えておいてあげましょう。

$ git checkout master
$ git push -f origin master

参考

git reset がよく分かっていなかったので参考にさせていただきました。