チャベログ

GitHubの過去のコミットを消したい

画像が読み込まれない場合はページを更新してみてください。

GitHubの過去のコミットを消す方法について備忘録です。

なぜ消したいかというと、easy-notion-blogでhtmlを変更した際に、GitHub ActionsのJestのテストでエラーに落ちまくり、解決するまで不要なコミットをpushし続けていたからです。

以下、その時の経緯を書いた記事です。

チーム開発ではリモートリポジトリのコミットを削除するのは禁止されていますが、今回の場合は自分一人での運用で、コミットを消しても問題ないことが明確なので、消すことにしました。

ローカルリポジトリの過去のコミットを削除する

まずはローカルリポジトリの過去のコミットを削除します。

過去のコミットは、git log --onelineで確認できます。

📝
--onelineオプションを付けた方が余分な情報を省いて1行で履歴が見れるので見やすいです。
$ git log --oneline
9b4e8e2 (HEAD -> main) .env.test
a666eba Change Top
7fba645 Change TopPage
f41e63b Add NEXT_PUBLIC_URL
06bdb35 バージョンを戻す
ecaf1d9 バージョンを戻す
2815f9c Merge branch 'main' of https://github.com/chabesu/easy-notion-blog
7032391 バージョンを戻す
58bc5f1 update snapshot
b62387e update snapshot
862c5be Change CSS
474e13f Change CSS
b1f579e Change CSS
8296e1a Change CSS
0cfaedb Use ExtLink
9358463 Use ExtLink
485dc1c Change Top Page
4cea8d2 Change Top Page
dd10d41 Change Top Page
a5f3774 Change Top Page
436bb6c Change Top Page
c84fef1 Change Top Page
1c25816 Change Top Page
450f6f5 Change Top Page
9e093dc change site title
3206c83 Fix expiry check
5fb9a2d Re-fetch expired images by using useSWR
8377dda Add /api/blocks endpoint
ac872ae Define Image.ExpiryTime
633902d Stop using image cache

今回は上記の下から6番目のコミット、9e093dc change site titleというコミットまで戻して、それ以降のコミットは消します。

コミットを削除するには$ git reset --hard <コミットハッシュ>というコマンドを使います。

$ git reset --hard 9e093dc
HEAD is now at 9e093dc change site title

これでローカルリポジトリからコミットを削除することができました。

git log --onelineで確認すると、きちんと削除出来ています。

$ git log --oneline
9e093dc (HEAD -> main) change site title
3206c83 Fix expiry check
5fb9a2d Re-fetch expired images by using useSWR
8377dda Add /api/blocks endpoint
ac872ae Define Image.ExpiryTime
633902d Stop using image cache
11f8a9e Install node-mocks-http
9a6be27 Install axios
9806b97 Install swr
0311c63 Update require Node version
4662190 Merge pull request #94 from otoyo/support-youtube-video-blocks
a56380f Refactor video.tsx
75b4ac8 Fix CSS selector
a97c428 Define helper methods
0ca8535 Format
2012ec1 Merge pull request #93 from herohoro/Support_video-embed_youtube
ac23e45 fix videoID
0557ee3 embed width-100%
9321baf add Video-embed
96f813c 🎉 Support youtube-video_embed
227de7c Get video-embed
151bee0 Install react-youtube
38c7968 Merge pull request #90 from herohoro/fix_diagram-center_mermaid
4858281 fix diagram-center_mermaid
4ebbc8a Merge pull request #88 from herohoro/fix_Initial-images
a702f3f fix_characterColor in darkmode
4598cdf fix_textOutline-quality
8d37d72 (tag: v0.8.0) Add blog link to README.ja
9e42102 Merge pull request #87 from otoyo/update-deps
47bbf5c Update and remove dependencies

ローカルリポジトリで過去のコミットを削除することができれば、次はリモートリポジトリ(GitHub)へ変更を反映します。

【補足】git resetコマンドについて

git reset コマンドはいくつか種類があります。

  • git reset --soft <コミットハッシュ>
    • ローカルリポジトリからのみ、コミットを削除する
  • git reset --mixed <コミットハッシュ>
    • ローカルリポジトリとステージングエリアから、コミットを削除する
  • git reset --hard <コミットハッシュ>
    • ローカルリポジトリとステージングエリアとワーキングディレクトリ全てから、コミットを削除する

詳細は公式ドキュメントを参照して下さい。

【補足】間違って削除したコミットを復元する

消したくないコミットを消してしまった場合でも、復元することができます。

まず、git reflogコマンドで現状を確認します。

$ git reflog
9a6be27 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~20
bec1049 (origin/main) HEAD@{1}: commit: .env.test
1f3d481 HEAD@{2}: commit: .env.test
e35e2f0 HEAD@{3}: commit: .env.test
51b563f HEAD@{4}: commit: .env.test

今回のケースでは、一番上の行のgit resetコマンドで消したくないコミットを消してしまったという状況です。

git resetをする前の状態に戻したい場合、今回の場合、2行目のbec1049 (origin/main) HEAD@{1}: commit: .env.testという状態に戻したい場合は、以下のコマンドで復元することができます。

git reset --hard HEAD@{1}

もっと前の状態に戻したいという場合、例えば、一番下の51b563f HEAD@{4}: commit: .env.testに戻したい場合は、同じように以下のコマンドで復元することができます。

51b563f HEAD@{4}: commit: .env.test

GitHubの過去のコミットを削除する

上記で行ったローカルリポジトリでコミットを削除した内容をGitHubへ反映します。

GitHubへ反映するためには、git pushコマンドを使用します。

ただし、いつも通りpushするとエラーが出てしまいます。

$ git push origin
To https://github.com/chabesu/easy-notion-blog.git
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/chabesu/easy-notion-blog.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

そこで、git push -fを使用します。

これはpushを強制するというコマンドです。

$ git push -f origin
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/chabesu/easy-notion-blog.git
 + bec1049...9e093dc main -> main (forced update)

これでGitHub上の消したいコミットも削除することができました。

ちなみにgit push -fというコマンドは色々と注意点があるようです。

終わりに

今回は過去のコミットを削除するということをやってみました。

チームで開発する場合は、リモートリポジトリのコミットを削除することはないのかなと思いますし、git push -fとかもあまり使わない?のかなと思っています。

そのあたり、やっぱりチーム開発とかをやってみないとよくわからないですね。。。

以上です、ありがとうございました!!