Git

【Git】コピペOK!誤ってmasterブランチでコミット&プッシュしてしまった時の対処法まとめ

Github

 

今回は誤ってmasterブランチで作業してしまい、加えてコミットまたはプッシュもしてしまった場合の対処方法について解説したいと思います。基本的にはコードをコピペするだけで解決できるように解説したいと思います。

masterブランチで作業してしまうミスは、git使いたての頃はあるあるだと思います。

対処法まとめ

masterでコミットしてしまった!直前のコミットを取り消したい!

  • git reset –soft HEAD^
  • git reset –hard HEAD^

 

masterでコミットしてしまった!複数のコミットを取り消したい!

  • git reset –hard <コミットID>

 

masterでコミット&プッシュしてしまった!直前の履歴を取り消したい!

  • git reset –hard HEAD^
  • git revert HEAD

 

masterでコミット&プッシュしてしまった!複数の履歴を取り消したい!

  • git revert HEAD~打ち消したい数

masterでコミットしてしまった場合

まずはmasterでコミットしてしまった場合の対処法について見ていきましょう。今回はコミットのみで、プッシュはしていないことが前提です。

このように誤ってmasterブランチで作業をし、そのままコミットしてしまいました。

Image from Gyazo
$ git add .
$ git commit -m "commit master"

commitの後ろに「-m」をつけることで、末尾にどのようなコミットなのかコメントを記入することができます。コミットメッセージは、「なぜ変更をしたか」を意識して書きましょう。

 

今の状態はこんな感じです。

masterでコミット git log

「git logコマンド」は、これまでのコミット履歴を確認することができるコマンドです。 これまでコミットをコミットメッセージの一覧という形で表示します。

git reset –soft HEAD^

「git reset –soft HEAD^」は直前のコミットを取り消す方法です。コミットした直後、すぐに過ち気づいた場合は使えるコマンドですね。

先ほど誤ってコミットした履歴をこのコマンドで取り消してみましょう。

$ git reset --soft HEAD^

 

再度「git logコマンド」で確認すると、誤ってコミットしてしまった履歴が取り消されているはずです。

git reset --soft HEAD

 

↓ このようにコードの変更履歴も戻ってくる

Image from Gyazo

git reset –hard HEAD^

「git reset –hard HEAD^」は直前のコミットを変更履歴ごと取り消す方法です。先ほどの–softオプションと比べてどのように異なるか見ていきましょう。

同様にmasterブランチでコミットしてしまったと仮定します。

$ git add .
$ git commit -m "commit master"
git log

 

では「git reset –hard HEAD^」を使ってコミットを取り消してみましょう。

$ git reset --hard HEAD^

 

再度「git logコマンド」で確認すると、–softオプションの時と同様に誤ってコミットしてしまった履歴が取り消されているはずです。

git reset --hard HEAD^

 

しかし–hardオプションを指定すると–softオプションの場合と違い、コードの変更履歴が戻ってきません。変更内容が全て消し飛ぶので、–softオプションに比べて慎重に行わなければならない点に注意しましょう。

↓ コードの変更履歴ごとなくなる

Image from Gyazo

git reset –hard <コミットID>

先ほど紹介した–hardオプションは、直前のコミットだけでなく、いかなるコミットも取り消すことができます。その場合は–hardの後ろにコミットIDを付与します。

コミットIDは「git logコマンド」で確認することができるよ。 

 

具体例で見ていきましょう。

以下のようにmasterで作業していたことに気づかず、3回コミットしてしまいました。今の状態を図で表すとこんな感じです。

ソースツリー コミット×3

 

では「initial commit」のところまで「–hardオプション」を使って戻ってみましょう。以下のコマンドをターミナルで打ち込んでください。そうすると、3つのコミット履歴が取り消されるはずです。

$ git reset --hard d0870d91b65fa9adcbabf3a07ef9797521a79efe
git reset --hard commitID
ポイントは戻りたいコミットIDを指定することです。

masterでプッシュまでしてしまった場合

次はmasterブランチでプッシュまでしてしまった場合の対処方法について解説したいと思います。

git reset –hard <コミットID>

コミットを取り消すコマンドでも使用しましたが、–hardオプションはプッシュまでしてしまった時にも有効です。手順はコミットを打ち消す時と同じになるので、今回は省略します。

–hardオプションは強制的に履歴を取り消せるんだなって覚えておきましょう。

git revert HEAD

「git revert」は、誤ったコミットを打ち消すコミットを新たに生成することで取り消すコマンドです。「git revert HEAD」はプッシュした直後、すぐに過ち気づいた場合は使えるコマンドですね。

まずはエラーを再現してみましょう。以下のようにmasterブラントで作業してしまい、コミット&プッシュをしてしまいました。

Image from Gyazo
$ git add .
$ git commit -m 'push master'
$ git push origin master

 

すると、このようにGithub上にもコミットされた履歴が残ってしまいました。

push履歴

 

↓ git logの結果

git log

 

 

これらをrevertを使って解消していきます。以下のコマンドを打ち込むと、誤ったコミットを打ち消すコミットが生成されると思います。

$ git revert HEAD

コマンドを打ち込むと画面が切り替わりますが、「:q」で抜けることができます。

↓ git logの結果

git revert HEADの結果

 

これで打ち消しコミットが生成されたので、あとはpushをするだけです。

$ git push origin master

 

リモートリポジトリにも打ち消しコミットの内容が反映されましたね。

git revert

git revert HEAD~打ち消したい数

「git revert」で複数の打ち消しコミットを作成することも可能です。例えば、最新のコミットを含めて5つ(計6つ)のコミットを打ち消したい場合は以下のようになります。

$ git revert HEAD~6

 

あとは同様にpushをし直すだけで完了です。

参考図書

 

 

今回は、誤ってmasterでコミットもしくはプッシュしてしまった時の対処法について解説しました。1人でやるときはrevertはせず、–hardオプションで直すのがベストかなと個人的には思います。