Gitで誤ってpushしてしまったときのpushの取り消し方法

Git

あ!! やべ、リモートのブランチにpushしちゃった….

みなさんは、こんなことないでしょうか?

developブランチで作業をしていて、そのままコミットまで行い

リモートのdevelopにPUSH!!!!!!!!

 

僕はよくあるんですよね。

feature/[ブランチ名]とブランチを切るのがめんどくさいので、とりあえず今の作業が終わってからでいいや!

とか

vscodeを使っているとそのまま今いるブランチでPUSH!!!って簡単にできてしまうので、「えぃ!!!」ってやってしまうんですw

まぁプロジェクトでやってるとメンバーに迷惑を掛けてしまうので極力やらないようには気をつけていますが、それでもホントたまにはやってしまいますよね!

そんな時に即座に元の状態に戻せたり仕組みを理解していれば焦らずに済みます!

やべっ!!!どうしよう!?!??ってなる前に、しっかりとGitでの対処方法をマスターしておきましょう!

 

PUSHしたこと自体をなかったことにしたい場合

誤ってPUSHしてしまったこと自体を取り消したい場合です。

やり方としては、リモートブランチの誤ってPUSHした分のコミットを戻して、ファイルの変更もコミットもなかったことにしてしまおう!ということです。

ただしこの方法、メリットもデメリットもあるので気をつけましょう!

メリット

  • うまくいけば誰にもバレない(スピード勝負w)
  • うまくいけば何事もなかったかのようにできる
  • 無駄なコミットが増えないで済む
  • 簡単にできる

デメリット

  • バレたらよくないw
  • 強制PUSHして強制的に履歴を書き換えなければならない
  • 誤ってPUSHしたリモートのブランチを他の誰かが既にローカルへ反映させていると、不整合が生じてその人は次回からpullできなくなる(rejectされる)

 

それでは、やり方を見ていきましょう。

戻したいコミットが直前だけの場合

誤ってPUSHしてしまった分のコミットが直前のコミット分だけの場合の対処方法です!

ローカルでの直前のコミットを取り消して、リモートブランチへ強制pushすることで修正していきましょう!

 

まず以下のコマンドでローカルの直前のコミットを取り消しましょう!

$ git reset --hard HEAD^

 

そしてこの状態でリモートへ普通にPUSHすると、コミット履歴で不整合が生じてしまっているのでPUSHできません。

そのためリモートのブランチを修正するために強制PUSHを使用してブランチを誤ってPUSHしてしまう前の状態へ戻しましょう!

ブランチ名の前に+をつけることで強制PUSHになります。

$ git push origin +master
または
$ git push origin +develop
など

 

戻したいコミットが複数ある場合

こちらは誤ってPUSHしてしまった分に含まれるコミットが複数ある場合の対処方法です!

手順としては、戻したい位置のコミットIDを確認しローカルのブランチをその位置まで戻します

その後先程と同様に、強制PUSHを使用して前の状態へ戻しましょう!

 

それではやっていきます!

まず戻したい位置のコミットIDを確認しましょう!

今回は、b08a643e981e07b4c46afc1c73aa3472cb778851に戻します。

$ git log
commit c0aa6dab84222b139ab60506009e6389c7c2dce7
Author: me <me@me.com>
Date:   Fri Mar 8 03:18:23 2019 +0900

    hogehogehogehoge

commit a2065501b90b8d1a103d6c72973aebab17593f06
Author: me <me@me.com>
Date:   Fri Mar 8 02:06:32 2019 +0900

    hogehogehoge

commit b08a643e981e07b4c46afc1c73aa3472cb778851 ★★ ここまで戻す
Author: me <me@me.com>
Date:   Wed Mar 6 02:06:57 2019 +0900

    hogehoge

 

そして先程確認したコミットIDまでコミットを戻します。

$ git checkout b08a643e981e07b4c46afc1c73aa3472cb778851

 

このままだと、HEADにいる状態になっていますので、ブランチ名をリネームして置き換えます。

# 今いる場所がHEADになっていることがわかる
$ git branch
* (HEAD detached at b08a643)

# 元のmasterブランチをリネームする
$ git branch -m master master_old

# 今のHEADを元にmasterブランチを作成し、移動する
$ git checkout -b master


$ git branch
* master
  master_old

# 指定したコミットIDまで戻っていることがわかる
$ git log
commit b08a643e981e07b4c46afc1c73aa3472cb778851
Author: me <me@me.com>
Date:   Wed Mar 6 02:06:57 2019 +0900

    hogehoge

 

そして先程と同様に、強制PUSHで状態を元に戻しましょう!

$ git push origin +master

 

リモートのpush操作だけを取り消す

ローカルの変更内容はそのままで、誤って行ってしまったリモートのPUSH操作だけを取り消す方法です

こちらは直接リモートのブランチのコミットを特定のコミットまで戻す操作になります。

事前にコミットIDを確認しておいて、リモートのブランチのコミットだけを書き換えることができます。

 

今回は先程確認したコミットID b08a643e981e07b4c46afc1c73aa3472cb778851に戻します。

$ git push -f origin b08a643e981e07b4c46afc1c73aa3472cb778851:master

 

PUSHした事実は残し、ファイルの変更内容は取り消したい場合

こちらは誤ってPUSHしてしまった分のコミットは残して、取り消しコミットで新しいコミットを作成し、ファイルの変更を取り消す方法です。

メリット

  • 新しいコミットなので、rejectされません
  • 履歴の不整合が生じないので、他の誰かがpullしてローカルへ変更を反映させても大丈夫

デメリット

  • 無駄なコミットが作成されてしまう

 

それではやり方を確認していきます!

打ち消すコミットがひとつの場合

打ち消すコミットがひとつの場合は、revertを使用します。

$ git revert HEAD

 

このようにgit logで差分を確認すると、直前に追加されたhoge3.txtが打ち消されて削除されていることがわかるかと思います!

$ git log -p
commit 6ca03c310298f5c0da997e84072c8d470cc4c465
Author: me <me@me.com>
Date:   Sat Mar 9 02:29:53 2019 +0900

    Revert "hogehogehogehoge"
    
    This reverts commit c0aa6dab84222b139ab60506009e6389c7c2dce7.

diff --git a/hoge3.txt b/hoge3.txt
deleted file mode 100644
index c653107..0000000
--- a/hoge3.txt
+++ /dev/null
@@ -1 +0,0 @@
-hogehoge3

 

このように打ち消しコミットを追加し、リモートとのGitの履歴にも異常はないためそのままPUSHできます!

$ git push origin master

 

打ち消すコミットが複数ある場合

最後に打ち消しコミットが複数ある場合も確認していきましょう!

 

戻したい位置を確認します!

今回は、b08a643e981e07b4c46afc1c73aa3472cb778851の状態に戻します。

$ git log
commit c0aa6dab84222b139ab60506009e6389c7c2dce7 ★★ 現在位置
Author: me <me@me.com>
Date:   Fri Mar 8 03:18:23 2019 +0900

    hogehogehogehoge

commit a2065501b90b8d1a103d6c72973aebab17593f06
Author: me <me@me.com>
Date:   Fri Mar 8 02:06:32 2019 +0900

    hogehogehoge

commit b08a643e981e07b4c46afc1c73aa3472cb778851 ★★ ここまで戻す
Author: me <me@me.com>
Date:   Wed Mar 6 02:06:57 2019 +0900

    hogehoge

 

現在いるコミットから戻したいコミットまでは2つ分なので、打ち消したい範囲を指定します。

HEAD..HEAD~2のように「…」で範囲を指定することができます。

$ git revert HEAD...HEAD~2

 

このようにgit logで差分を確認すると、指定した範囲の変更が打ち消しされていることがわかるかと思います!

$ git log -p
commit 12e324d8adc2dd6b569e442bac4818b9ec89388c
Author: me <me@me.com>
Date:   Sat Mar 9 03:01:58 2019 +0900

    Revert "hogehogehoge"
    
    This reverts commit a2065501b90b8d1a103d6c72973aebab17593f06.

diff --git a/hoge2.txt b/hoge2.txt
deleted file mode 100644
index dc74a70..0000000
--- a/hoge2.txt
+++ /dev/null
@@ -1 +0,0 @@
-hogehoge2

commit 709ff1f23f947929508db271fa5c20856d907d55
Author: me <me@me.com>
Date:   Sat Mar 9 03:01:55 2019 +0900

    Revert "hogehogehogehoge"
    
    This reverts commit c0aa6dab84222b139ab60506009e6389c7c2dce7.

diff --git a/hoge3.txt b/hoge3.txt
deleted file mode 100644
index c653107..0000000
--- a/hoge3.txt
+++ /dev/null
@@ -1 +0,0 @@
-hogehoge3

 

打ち消すことができましたので、PUSHしておきましょう!

$ git push origin master

 

 

このように誤ってpushしてしまったときの取り消し方法を確認してきましたが、実際にプロジェクトなどで誤ってdevelopやmasterを直接変更してしまった場合は、Gitを管理している方と修正方法を相談してからの方が良いでしょう!

事前に本記事で修正方法を確認しておくと、Git管理者の方とも話がスムーズですし、何より焦らずに済みますので、この機会にしっかりと確認しておきましょう!

 

またGitで誤ってコミットしてしまった!!なんて場合は以下の記事を参考にしてください。

Gitで誤ってコミットしたファイルをaddの前の状態に戻したいとき

 

Gitを最短でマスターする方法

Gitの書籍でマスターする

Gitが、おもしろいほどわかる基本の使い方33〈バージョン管理、SourceTree、Bitbucket〉

この書籍は、プログラミングを初めたばかりの初心者やGitをコマンド操作ではなく、SourceTreeというツールで簡単に初めたい方にオススメです。

Gitをコマンド操作すると言われてコマンドって何?と思う方は是非この本からGitの基礎を学ぶことをオススメします!

イラスト、図、実際の操作画面が豊富に使用されていますので、わかりやすさも抜群です!

 


Gitが、おもしろいほどわかる基本の使い方33〈バージョン管理、SourceTree、Bitbucket〉

 

独習Git

この本は基礎から実際のプロジェクトでの活用方法までのガッツリ習得したい方向けとなっています。

プログラミングを学び初めて半年以上の方や仕事でプログラミングをやっている方が一からGitを学ぶ場合にオススメの書籍です。


独習Git

Udemyの講座でマスターする

もう怖くないGit!チーム開発で必要なGitを完全マスター

僕は最初ネットの記事などを見てGitを使っていたのですが、基礎からしっかりとGitをマスターしたいと思い、こちらの講座を受講しました!

内容的には、プログラミング初心者でも経験者でもGitを一から学びたいという方はオススメです!

こちらの講座はGitをコマンドラインで進めていくのですが、Gitを難しい部分をイメージできるようにイラストや図で詳しく解説されていて、addcommitが裏で何をしているのかまで詳しく理解できるようになります!

どうしても書籍のほうがいい!というこだわりがなければ、udemyの動画であれば実際に手を動かさなくても、ただ動画を見るだけで理解ができてしまうのでオススメです。

忙しくて勉強時間をなかなか取れない方など、隙間時間に動画をみて、空いた時間で実際に手を動かしてやってみるなど工夫すると最速でGitが理解できるのでオススメです!

※こちらの画像をクリックするとUdemyの講座のページへ飛ぶことができます!

 

その他にもオススメのGit講座を紹介しておきますね!

 

Git入門: ノンプログラマーのための Git

こちらはUdemyでのベストセラーになっているぐらい高評価の講座となっています!

 

Git & Github基礎講座

GitもGithubも一緒に基礎から学習することができます!

 

コメント