開発備忘録
【初心者向け】Gitで間違ったコミットをpushしたときのリセット法

Gitを使っていると、うっかり間違ったコミットをpushしてしまうこと、ありますよね?… えっ、ない?そうかぁ〜、、、残念ながら私はアホなので、git関連操作でよくミスしてしまいます。それで、今回の記事では「誤ってcommitをリモートリポジトリにpushしてしまった時」の解決策を備忘録として書いて行きたいと思います。
この記事では、初心者向けに過去のコミットにリセットする方法を、ステップbyステップでわかりやすく解説していきたいと思います!
注意書き
とはいえ、基本リモートリポジトリに登録されているコミットを消去してリセットすることは、あたかもプロジェクトの変更履歴を削除し、最初から無かったことにするようなことなので、最善策ではありません。リセットする前に、現在の作業をバックアップしておくことを強くおすすめします。できれば、ローカルのcommitをリモートリポジトリへpushする前には、よく確認してからpushしたいものです。
仕事などで複数人の開発者で一つのgitで管理されているプロジェクトで作業してる場合、ほかの開発メンバーにも影響がでます。例えば、他のメンバーが同じリポジトリを使っている場合、彼らの作業が失われてしまう可能性があるので、使う前にしっかり違いに連携しておきましょう。
では早速おっ始めようぜ!
コンテンツの目次
ステップ1: 元に戻したいバージョンのコミットを探す
最初にするべきは、どのコミットに戻すかを見つけることです。では早速、あなたのMacにある、Terminal(ターミナル)というコマンドラインインターフェイス(略してCLI)のツールを開いて、リモートリポジトリでバージョン管理されている、あなたのXcodeプロジェクトファイルがローカルでどこにあるかを確認して、そのディレクトリに移動します。
今回は例えとして、この記事で紹介している「SwipeCards」のXcodeプロジェクトファイルを利用して行きます。私のmacでSwipeCardsのXcodeプロジェクトファイルは、document/AppProjects/SwipeCardsのディレクトリに格納していますので、以下コマンドを実行し、ディレクトリに移動します。
cd document/AppProjects/SwipeCards
これで、プロジェクトのディレクトリに到着しました!では、コミットの履歴を表示しましょう。以下のコマンドを叩いて、コミットの変更履歴を表示します。
git log --oneline
すると、以下のように、過去のコミットがポンポンと表示されます。
3e4ba14 (HEAD -> main, origin/main) しもたー! これはダメなコミット!
bdacbbd 安全なコミット
d82c9f2 minor updates
64b8d3a updates with staged changes
8fb7b48 不要ファイル消去
616ea4d Initial Commit
上記は、実際に私のターミナルで表示されたコミットの履歴となります。現在、指定されているコミットは「3e4ba14 (HEAD -> main, origin/main) しもたー! これはダメなコミット!」となっております。
この中から元に戻したいコミットを見つけて、そのコミットのIDをコピーします。この場合私は、「d82c9f2 安全なコミット」に戻したいので、「d82c9f2」をコピーします。
ステップ2: 元に戻したいバージョンのコミットにリセットする
元に戻したいコミットを見つけたら、次にそのコミットにリセットします。リセットすることで、その時点の状態に戻すことができます。
リセットコマンドを実行
以下のコマンドを使って、指定したコミットにリセットします。
git reset --hard <コミットID>
例:
git reset --hard 7e0a85f
このコマンドを実行すると、リセットしたコミットの状態にプロジェクトが戻ります。
注意点:「
--hard
」を使うと、作業ディレクトリの変更内容もすべてリセットされるので、変更内容が失われることに注意してください。
ステップ3: 元に戻したいコミットに切り替わったか確認する
リセットが完了したら、実際にそのコミットに切り替わったか確認します。
Xcodeで確認する方法
Xcodeのプロジェクトを開き、画面左上部の(1)「Source Control」アイコンをクリックし、(2)「Repositories」を選択し、現在作業中の「SwipeCards main / Branches / main (current) 」を選択することでコミットのリストが画面右側に上から最新の順番で表示されます。ここで元に戻したいコミット(安全なコミット)が以下の画像の通り、一番上に表示されていることが確認できます。

Terminalで確認する方法
先ほども紹介した通り、Terminalでもコミットを以下の通り、コマンドを実行して現在のコミットを確認できます。
git log --oneline
以下の通りに、表示されたコミットIDが、元に戻したいコミット(安全なコミット)と一致していれば、ローカル上ではリセット成功です。
bdacbbd (HEAD -> main, origin/main) 安全なコミット
d82c9f2 minor updates
64b8d3a updates with staged changes
8fb7b48 不要ファイル消去
616ea4d Initial Commit
元に戻したいコミット、つまり上記の例えでは「bdacbbd 安全なコミット」が、現在最新になっていることを確認できます。しかし、ここで一つの問題があります。次のステップに移りましょう。
ステップ4: リモートリポジトリで元に戻したいコミットにリセットする
現時点でGithubのリモートリポジトリを実際に開いて確認すると、以下の写真の通り、元に戻したいコミットが最新の状態になっていないのではないでしょうか?

ターミナルからコマンドを実行してリセットしたはずなのに、あのウザイ「しもたー! これはダメなコミット!」が、まだ最新のままになっています。そうです、ローカルリポジトリでリセットしただけでは、リモートリポジトリには反映されません。
ここで目指したいのは、「安全なコミット」のバージョンが、githubのリモートリポジトリ上でも最新にしたい!ということです。リモートリポジトリもリセットするためには、--force
オプションを使って強制的にpushする必要があります。
強制的にpushする
では、以下のコマンドを使って、リモートリポジトリにも反映したいと思います。
git push origin <ブランチの名前> --force
<ブランチの名前>
の部分には、実際のブランチ名を入力してください。今回の例では、ブランチは切っていないので、今回は例えとしてmainをとなります。例えば:
git push origin main --force
これで、リモートリポジトリでも、安全なコミットが最新になっているはずです。では念の為、Githubでも確認しましょう。

はい、上記の通り、GitHubのcommitを確認すると、元に戻したいコミットバージョンが最新になっていることが確認できます。
ちょっと本題からそれますが、gitでpullしたりpushしたりする際に、以下の通り「sshのパスフレーズ」を何度も求められることがありますか?その場合は、こちらの備忘録を参照してください。
以上、間違ったcommitをリモートにpushしてしまった時、過去のcommitにリセットし、リモートでもリセットする対策についてご紹介しました。これで、間違ったコミットをpushしてしまった場合に、過去のコミットにリセットする方法を学ぶことができました。Gitの使い方に慣れると、より効率的に開発を進められるようになりますので、ぜひ覚えておきましょう!
ただ、前途でも述べました通り、これは最善策ではないので、トラブルを防ぐためにも、できればcommit / リモートにpushする前に、よーく確認してからにしましょう。
では、ごきげんよう、さいなら。