Gitでマージの取り消しを理解する!初心者向け実践ガイド
こんにちは、とまだです。
「間違えてマージしちゃった!」 「このマージ、なかったことにできないかな...」
Gitを使っていて、こんな経験ありませんか?
焦りますよね。 特にチーム開発で間違えると、冷や汗が出てきます。
でも大丈夫です。 Gitには、マージを取り消す方法がちゃんと用意されています。
今回は、マージの取り消し方法を初心者向けに解説します。
Gitのマージ取り消しとは?
マージの取り消しって、難しそうに聞こえますよね。
でも実は、日常生活でよくある「やり直し」と同じです。
例えば、料理で調味料を入れすぎた時。 水を足して薄めたり、別の調味料でバランスを取ったりしますよね。
Gitのマージ取り消しも、似たような感覚です。
マージを取り消したくなる場面
実際の開発では、こんな時にマージを取り消したくなります。
よくあるパターン:
- 開発途中の機能を誤ってメインブランチにマージ
- コンフリクトの解決ミスで、意図しない変更が混入
- レビュー前なのに、うっかりマージボタンを押してしまった
- マージ先のブランチを間違えた
私も以前、金曜の夕方に急いで作業していて、開発中の機能をそのままメインブランチにマージしてしまったことがあります。
週末を迎える前に気づいて、本当に助かりました。
取り消し方法は主に2つ
Gitでマージを取り消す方法は、大きく分けて2つあります。
それぞれ特徴が違うので、状況に応じて使い分けます。
1. revert:履歴を残しながら取り消す
revertは「打ち消しコミット」を作る方法です。
日記に例えると、間違いを消しゴムで消すのではなく、「さっきの内容は間違いでした」と新しく書き加えるイメージです。
特徴:
- 履歴が残るので、後から経緯を追える
- チームで共有済みのコミットも安全に取り消せる
- プッシュ済みでも問題なし
2. reset:履歴ごと巻き戻す
resetは「なかったことにする」方法です。
タイムマシンで過去に戻って、マージ自体をなかったことにするイメージです。
特徴:
- 履歴がきれいになる
- ローカルでの作業に向いている
- プッシュ済みの場合は要注意
revertでマージを取り消す方法
では、実際の手順を見ていきましょう。
まずは、より安全なrevertから説明します。
基本的な使い方
マージコミットを取り消す時は、以下のコマンドを使います。
git revert -m 1 <マージコミットのハッシュ>
このコマンドのポイント:
-m 1
はマージの親を指定するオプション- 通常は
-m 1
で問題ありません
具体的な手順
実際の流れはこんな感じです。
# 1. まず履歴を確認
git log --oneline --graph
# 2. 取り消したいマージコミットのハッシュを探す
# 例:「Merge branch 'feature-A'」のようなメッセージを探す
# 3. revertを実行
git revert -m 1 abc1234
# 4. エディタが開いたら、コミットメッセージを確認して保存
# 5. プッシュして共有
git push origin main
revertの良いところは、チームメンバーに迷惑をかけないこと。
「このマージは取り消しました」という記録が残るので、後から見ても分かりやすいです。
resetでマージを取り消す方法
次に、より強力なresetの使い方です。
基本的な使い方
マージ直前の状態に戻すには、以下のコマンドを使います。
git reset --hard HEAD^
このコマンドの意味:
HEAD^
は「現在の1つ前のコミット」--hard
は作業ディレクトリも含めて完全に戻す
resetの3つのモード
resetには3つのモードがあります。
料理に例えると:
- --soft:レシピ(履歴)だけ戻して、作った料理(ファイル)はそのまま
- --mixed:レシピは戻すけど、材料(変更内容)は手元に残す
- --hard:全部なかったことにして、最初からやり直す
マージを完全に取り消したい場合は、通常 --hard
を使います。
注意点:プッシュ済みの場合
resetの最大の注意点は、プッシュ済みの履歴を変更すること。
チームメンバーが既に取り込んでいる履歴を書き換えると、混乱の元になります。
プッシュ前なら問題ありませんが、プッシュ後は慎重に判断しましょう。
実践的な使い分けガイド
では、どんな時にどちらを使えばいいのでしょうか?
revertを使うべき場面
こんな時はrevertが安全です:
チーム開発の基本:
- 既にリモートにプッシュした
- 他のメンバーがpullしているかもしれない
- 履歴を残しておきたい
- 後から経緯を追跡したい
具体例: 本番環境にデプロイ済みの機能に不具合が見つかった場合。 revertで一時的に機能を無効化し、修正後に再度マージします。
resetを使うべき場面
こんな時はresetが便利です:
個人作業の基本:
- まだローカルにしかない
- 履歴をきれいに保ちたい
- 実験的な変更を取り消したい
- 間違えたばかりですぐに気づいた
具体例: 個人プロジェクトで、間違ったブランチにマージしてしまった場合。 すぐにresetで戻して、正しいブランチで作業を続けます。
よくあるトラブルと対処法
マージ取り消しでよくある問題と、その解決策を紹介します。
トラブル1:コンフリクトが発生
revert時にコンフリクトが起きることがあります。
対処法:
# コンフリクトを確認
git status
# ファイルを編集してコンフリクトを解消
# その後、通常通りコミット
git add .
git revert --continue
落ち着いて、一つずつ解決していけば大丈夫です。
トラブル2:どのコミットか分からない
マージコミットが見つからない時は、より詳しく履歴を見ます。
# マージコミットだけを表示
git log --merges --oneline
# グラフ表示で視覚的に確認
git log --graph --pretty=format:'%h %s' --abbrev-commit
トラブル3:間違えてresetしてしまった
resetで消してしまったコミットも、実は復活できます。
# 最近の操作履歴を確認
git reflog
# 戻したいポイントのハッシュを指定
git reset --hard <ハッシュ>
Gitは意外と親切で、簡単には情報を失わないようになっています。
実務でのベストプラクティス
最後に、実際の開発で役立つコツをまとめます。
取り消し前のチェックリスト
操作前に確認すべきこと:
- 現在のブランチは正しいか?
- ローカルの変更は保存したか?
- チームメンバーへの影響は?
- バックアップは必要か?
コミットメッセージの書き方
revert時のメッセージは分かりやすく:
Revert "Add user authentication feature"
この機能にセキュリティ上の問題が見つかったため、
一時的に取り消します。
修正版は issue #123 で対応予定です。
理由を明記しておくと、後から見た時に助かります。
チームへの連絡
マージ取り消しは、チームに影響する操作です。
連絡すべきこと:
- 何を取り消したか
- なぜ取り消したか
- 今後の対応予定
- 他メンバーがすべきこと
SlackやGitHubのPRコメントなどで、速やかに共有しましょう。
まとめ
Gitのマージ取り消しについて、revertとresetの2つの方法を解説しました。
覚えておくポイント:
- revert:履歴を残して安全に取り消す(チーム開発向き)
- reset:履歴ごと巻き戻す(ローカル作業向き)
最初は怖いかもしれませんが、仕組みを理解すれば怖くありません。
むしろ、取り消し方法を知っていることで、積極的にマージできるようになります。
失敗を恐れずに、どんどん挑戦していきましょう。 万が一の時は、この記事を参考に落ち着いて対処してくださいね。
著者について

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