はじめに
以前、不具合調査などのために自分の環境を特定のコミットの状態にするための git reset
コマンドの使い方をまとめました(→こちら)。
今回は同じコマンドを使って、リモートにプッシュしてしまったコミットを取り消そう、というものです。
ただし、リモートのコミットを取り消すのは安易には行わないでください。一緒に作業している人がいれば、確認を取ってからやるようにしましょう。
また、この方法は履歴が残らない、完全な歴史改変となるため、その点にもご注意を。
手順
以降の説明は master
に入れてしまった修正を取り消したいということで進めていきます。
修正をローカルに取り込み、内容を確認
git pull
で修正を取り込み、 git log
コマンドで内容を確認します。
一度に多くのログを表示させたい場合、--oneline
オプションが便利です。
ここで大事なのは内容とコミットのハッシュ値です。
今回は「お気に入り機能」に取り掛かる前の f2940ec
(下から2行目)に戻したいとします。
$ git pull
... (割愛)
$ git log --oneline -n 20
278f6b2 Merge pull request #165 from yokoba569/v1.7.3_dev
7a23fb5 (origin/v1.7.3_dev, v1.7.3_dev) Merge pull request #164 from yokoba569/#418_お気に入り対応
2394231 (origin/#418_お気に入り対応, #418_お気に入り対応) refs #418 DD対応 修正漏れ
8daa0f3 refs #418 お気に入り機能
f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
a41ef31 ....
特定のコミットに戻す
戻したいコミットのハッシュ値がわかったので git reset
コマンドを使っていきます。
変更差分を残しておく必要はないので --hard
をつけましょう。
$ git reset --hard f2940ec
HEAD is now at f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
これでローカルの環境が「お気に入り機能」に取り掛かる前の状態になりました。
ローカルの状態を強制的にリモートにプッシュ
ローカルの状態は整ったので、これを強制的にリモートにプッシュします。
push
コマンドに -f
オプションをつけましょう。
$ git push origin master -f
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/yokoba569/SampleProject.git
+ 278f6b2...f2940ec master -> master (forced update)
これで作業完了です。
最後に
間違って master にマージしてしまったときにお世話になったのがこちらでした。
プルリクエストのマージ先はちゃんと確認してから作業したいものです。