Gitでマージを取り消したい!revertとresetの使い分けを解説
こんにちは、とまだです。
「あれ?間違ったブランチをマージしちゃった!」
Gitを使っていると、こんな冷や汗をかく瞬間がありますよね。
レビュー前のコードを本番ブランチに入れてしまったり。 コンフリクト解消で間違った選択をしてしまったり。
大丈夫です。 Gitには、こうしたミスをなかったことにする方法があります。
今回は、マージを取り消す2つの方法「revert」と「reset」について解説します。
この記事を読み終わる頃には、落ち着いて対処できるようになっているはずです。
そもそもGit mergeとは?
Git mergeは、別々のブランチで作った変更を1つにまとめる操作です。
日常生活でたとえるなら、2人が別々にレポートを書いて、最後に1つの文書にまとめるようなものです。
通常の開発では、こんな流れで使います。
- 機能ごとに新しいブランチを作る
- そのブランチで開発を進める
- 完成したらメインブランチにマージする
でも、このマージ作業で失敗することがあるんです。
どんなときにマージを取り消したくなる?
マージを取り消したくなる場面は、主に3つあります。
1. ブランチを間違えた
開発ブランチAをマージするつもりが、テスト用ブランチBをマージしてしまった。
よくあるミスです。 ブランチ名が似ていたりすると、特に起こりやすいですね。
2. コンフリクト解消でミスった
コンフリクトが発生したとき、どちらのコードを残すか選ぶ必要があります。
この選択を間違えると、必要なコードが消えてしまうことがあります。
3. レビュー前のコードを入れてしまった
「ちょっと動作確認だけ...」と思ってマージしたら、そのまま本番に流れてしまいそう。
こういうヒヤリハットも、実はよく起きるんです。
安全に取り消す方法:git revert
まず紹介するのは「revert」という方法です。
revertは、マージを「なかったことにする」のではなく「打ち消す」方法です。
revertの仕組み
revertを日常でたとえると、間違った注文をキャンセルするようなものです。
注文履歴には「注文した」記録と「キャンセルした」記録の両方が残ります。 でも、実際の商品は届きません。
Gitでも同じです。 マージの履歴は残りますが、コードは元の状態に戻ります。
revertの使い方
まず、取り消したいマージコミットを特定します。
git log --oneline
このコマンドで履歴を確認すると、こんな感じで表示されます。
abcd123 (HEAD -> main) Merge branch 'feature-a'
efgh456 Add new file
ijkl789 Update README
この例では、abcd123
がマージコミットです。
次に、このマージを取り消します。
git revert -m 1 abcd123
-m 1
は、マージの親を指定するオプションです。
通常は「1」を指定すれば大丈夫です。
実行すると、新しいコミットが作られます。 このコミットが、マージを打ち消す役割を果たします。
revertのメリット
revertの最大のメリットは、履歴を壊さないことです。
チーム開発では、履歴の整合性がとても重要です。 revertなら、誰が見ても「何が起きたか」がわかります。
履歴ごと戻す方法:git reset
次に紹介するのは「reset」という方法です。
resetは、マージ自体をなかったことにします。
resetの仕組み
resetを日常でたとえると、タイムマシンで過去に戻るようなものです。
マージする前の時点に戻るので、マージの記録自体が消えます。
resetの使い方
マージ前の状態に戻りたい場合は、こうします。
git reset --hard HEAD^
HEAD^
は、1つ前のコミットを意味します。
特定のコミットまで戻りたい場合は、コミットハッシュを指定します。
git reset --hard ijkl789
この場合、ijkl789
の状態まで戻ります。
resetの注意点
resetは強力ですが、その分リスクもあります。
特に、すでにリモートにプッシュしている場合は要注意です。 他のメンバーの作業に影響を与える可能性があります。
個人の作業ブランチで使う分には問題ありませんが、共有ブランチでは慎重に使いましょう。
revertとresetの使い分け
では、どちらを使えばいいのでしょうか?
revertを使うべき場面
- すでにリモートにプッシュしている
- チームで共有しているブランチ
- 履歴を残しておきたい
基本的には、revertを使うことをおすすめします。 安全で、後から何が起きたか追跡しやすいからです。
resetを使ってもいい場面
- まだローカルにしかない
- 個人の作業ブランチ
- 履歴をきれいに保ちたい
自分だけの環境なら、resetで履歴をきれいにするのもありです。
取り消した後の注意点
マージを取り消した後も、いくつか気をつけることがあります。
リモートとの同期
revertの場合は、普通にプッシュすれば大丈夫です。
git push origin main
resetの場合は、強制プッシュが必要になることがあります。
git push --force origin main
ただし、強制プッシュは最終手段です。 チームメンバーに事前に伝えてから実行しましょう。
コンフリクトの再発に備える
マージを取り消しても、問題の原因は残っています。
次にマージするときは、同じミスを繰り返さないよう注意が必要です。
コンフリクトが原因だった場合は、解消方法を見直しましょう。 ブランチを間違えた場合は、ブランチ名を確認する習慣をつけましょう。
チーム開発でのルール作り
マージの取り消しは、チーム全体で方針を決めておくと安心です。
例えば、こんなルールを作っておくといいでしょう。
- 共有ブランチではrevertを使う
- resetは個人ブランチのみOK
- 強制プッシュは事前に連絡する
ルールがあれば、いざというときに迷わず対処できます。
まとめ
Gitでマージを取り消す方法を2つ紹介しました。
revert:履歴を残して安全に取り消す reset:履歴ごと消して完全に戻す
初心者の方は、まずrevertから覚えることをおすすめします。 安全で、チーム開発でも使いやすいからです。
マージのミスは誰にでも起こります。 大切なのは、落ち着いて適切に対処することです。
この記事で紹介した方法を覚えておけば、もう慌てる必要はありません。
ミスを恐れず、積極的にGitを使っていきましょう!
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →