🎉

GitHub に push しちゃった commit を取り消す

2022/10/11に公開約1,600字

GitHub にあげたくない情報を upload してしまった

たまにありますよね、はい。
削除する commit を打って push したとしても、履歴としては残ってしまうので対応としてはよろしくないです。

とりあえず private にする

ほんとに急ぎの場合にはとりあえず private に変更します。

とりあえず手元でバックアップをとる

この後の操作で、該当のファイル・フォルダが一時的に消えてしまうので、repository 全体をとりあえず適当にコピーしておきます。

ちょっと気になるくらいであれば commit を修正

すでに該当の commit からいくつか commit を積んでいるときもありますよね、はい。
GitHub を前提にしているので、該当のフォルダ、ファイルをつかんで、その history を表示させます。
history は右上のリンクから表示できます。

history on GitHub
history detail on GitHub

ここで表示される commit ID は実際の ID のうちの先頭 6 文字分を示しています。
実際の commit ID は 5fe6c1284e320aaf5cc86717eff4f35d3ef33ae4 なのですが、表示されているのは 5fe6c12 までです。

で、次に git rebase -i HEAD~20 などと叩き、該当の commit を含む commit log を表示 (?) させます。
HEAD~20 の部分がどれくらい commit を遡るかを示しているので、近めの commit であれば HEAD~5 くらいでいいでしょうし、もっと古ければ HEAD~50 にするという具合です。

私の環境では nano が立ち上がり、commit を pick するかを選べる画面が出てきます。
いくつかの commit とその commit message が並んでいますが、そのうち GitHub で確認した該当の commit を示す pick xxxxxxx ... を削除します。
上記 GitHub のスクリーンショットでは 2 つの commit に対応しているようなので 2 行分頑張って探して消します。

該当のファイルを再度追加

commit がないことになっているので、その commit に含まれていたファイルも消えてしまっています。
これを先ほどのバックアップからコピーして戻してきます。
そのあと git add して git commit します。

強制的に git push

あまりほめられたことではないのですが仕方がないので remote 側を今の commit で上書きしてしまいます。
参考にある URL では git push origin +master と書かれていますが、最近の reposiroty であれば git push origin +main となるでしょう。

これにより、remote である GitHub 側の commit がすべて手元のものに置き換えられ、過去の commit はなかったことになります。

参考

  • 日本語でわかりやすく説明されているブログ

https://pandazx.hatenablog.com/entry/2012/10/14/005716

  • git push の help

https://git-scm.com/docs/git-push#Documentation/git-push.txt--f

Discussion

ログインするとコメントできます