まず、「revert」ってなに?
開発中に「あっ、間違ってマージしちゃった…」とか、「コミットして push までしちゃったけど、取り消したい…」って経験、ありますよね?
そんなときに便利なのが、git revert です。
git revert は、過去のコミットを「なかったことにする」コマンド。ただし、履歴を消すのではなく、その変更を打ち消す新しいコミットを作成するのがポイントです。つまり、安全に元に戻すことができます。
基本の使い方
使い方はとてもシンプルです。
git revert <コミットハッシュ>
例えば、ログで取り消したいコミット (9a0b1c2) を見つけたら、こう実行します
git revert 9a0b1c2
実行すると、「不要な変更Cを打ち消すコミット」が新しく作られ、履歴は以下のようになります
9a0b1c2 不要な変更C
abcd123 Revert "不要な変更C"
「revert」は履歴を壊さない
ここが git reset との大きな違いです。
| コマンド | 履歴の扱い | 安全性 | 主な使いどころ |
|---|---|---|---|
git revert |
履歴は残る | 安全 | 公開済みブランチの修正取り消し |
git reset |
履歴は消える | 危険 | ローカルでのやり直しや整理 |
チームで共有している main ブランチなど、公開されているブランチでは reset を使うと履歴が壊れます。一方、revert は「打ち消すだけ」なので、他の人に影響を与えません。
マージコミットを取り消すときの注意点
マージを取り消したいときは、通常通り git revert するとエラーになることがあります。
その際は「どちらのブランチを残すか」を -m オプションで指定する必要があります。
git revert -m 1 <マージコミットのハッシュ>
-
-m 1→ メインブランチ(親1)を残す -
-m 2→ マージしてきた側のブランチを残す
例えば、feature/add-login を main にマージしたけど、そのマージ自体を取り消してマージ前の状態に戻したい場合は、-m 1 を指定します。
コンフリクトが出たときは?
revert 中にコンフリクト(競合)が起きることもあります。
その場合の対応手順はこちらです
- コンフリクトを手動で修正
- 修正ファイルをステージングに追加
git add . -
revert処理を続行途中でgit revert --continuerevertを中止したい場合は、次のコマンドを使います。git revert --abort
複数のコミットをまとめて取り消す方法
1件ずつ revert するのが面倒な場合は、範囲を指定して一気に取り消すことができます。
git revert --no-commit <開始ハッシュ>^..<終了ハッシュ>
git commit -m "Revert multiple commits"
これにより、複数のコミットの変更をまとめて1回の revert コミットとして処理できます。
まとめ:「revert」は履歴を守る保険
「間違えた!」と思っても、焦らずに revert を思い出してください。安全に取り消せる知識を持っているだけで、Git 操作の自信がグッと増しますよ!