Gitで作業を巻き戻したいときによく使われるのがrevertとresetです。どちらも「履歴を戻す」ためのコマンドですが、仕組みや使いどころが大きく異なります。正しく理解して使い分けることで、誤った操作によるトラブルを防ぎ、チーム開発でも安全に履歴を管理できます。
revertとは
revertは指定したコミットを打ち消す新しいコミットを作成する操作です。既存の履歴はそのまま残り、対象の変更だけが取り消されます。
# 特定のコミットを打ち消す
git revert a1b2c3d
これにより、a1b2c3dの変更を打ち消す新しいコミットが履歴に追加されます。履歴は改変せず、追加のみ行うため共有ブランチで安全に使えます。
resetとは
resetは指定したコミットの状態に履歴を巻き戻す操作です。HEADを動かし、対象以降のコミットをなかったことにできます。オプションによって影響範囲が異なります。
# 指定コミットまで履歴を戻す
git reset --soft a1b2c3d # コミットだけ取り消し、変更はステージングに残す
git reset --mixed a1b2c3d # コミットを取り消し、変更はワークツリーに残す(デフォルト)
git reset --hard a1b2c3d # コミットも変更も完全に破棄
resetは履歴を書き換えるため、既に共有したブランチで使うと他の人の履歴と衝突してしまいます。
履歴の違い
- revert:取り消しコミットを追加するため履歴は改変されない
- reset:HEADを過去に移動させて履歴を巻き戻す。公開済み履歴では危険
使い分けの目安
– チームで共有しているブランチ → revertを使う
– 自分だけのローカルブランチ → resetを使って整理する
– 公開済みブランチの誤コミット取り消し → revertで安全に取り消す
– 開発中に履歴をまとめ直す → resetやrebaseで整える
実用例
# 誤ってcommitしてpushしてしまった場合
git revert HEAD
# ローカルで作業をやり直したい場合
git reset --hard HEAD~1
まとめ
– revertは「取り消しコミットを追加」して履歴を安全に残す
– resetは「履歴そのものを巻き戻す」ため強力だが扱いに注意が必要
– 共有ブランチではrevert、自分の作業整理ではresetを使うのが基本
両者の違いを理解し、状況に応じて正しく使い分けることがGit運用を円滑に進めるポイントです。