CreaTools LogoCreaTools
Tips

git reset と revert、どっちを使う?

2025-11-22

結論:push済みかどうかで決まる

状況使うコマンド
push前git reset
push後git revert

迷ったらrevert。履歴を壊さないので安全。


なぜこの使い分けか

reset:  A → B → C → (Cを消す) → A → B
revert: A → B → C → (Cを打ち消す) → A → B → C → D
  • reset = コミットを削除する
  • revert = コミットを打ち消す新しいコミットを作る

push済みのコミットをresetで消すと、リモートと履歴が食い違う。他の人がpullしたときに地獄になる。


resetの使い方(push前専用)

直前のコミットを取り消す

# コミットだけ消す。変更はステージに残る
git reset --soft HEAD^

# コミットもステージも消す。変更はファイルに残る
git reset --mixed HEAD^

# 全部消す(危険)
git reset --hard HEAD^

どのオプションを使うか

やりたいことオプション
コミットをやり直したい--soft
addからやり直したい--mixed
変更自体を捨てたい--hard

**--hardは復元できない。**本当に捨てていいか確認してから。


revertの使い方(push後OK)

直前のコミットを打ち消す

git revert HEAD

エディタが開く。メッセージを確認して保存。

特定のコミットを打ち消す

git revert abc1234

私がやらかした失敗

「間違えたからreset --hardしてforce pushすればいいや」

→ チームメンバーがすでにpull済み → 「履歴が壊れてpullできない」と連絡が来る → 全員にfetch --allとreset --hard origin/mainを依頼 → 作業中の人のローカル変更が消える

force pushは「チーム全員の作業を巻き込む」という意識がなかった。

正解はrevertでpushすること。履歴は増えるが、誰も困らない。


「履歴を綺麗にしたい」は本当か

resetで消したい理由が「履歴を綺麗にしたい」なら、考え直す。

優先度重要度
履歴の綺麗さ低い
チームが困らないこと高い

revertで打ち消しコミットが残っても、誰も困らない。困るのは履歴を書き換えたとき。


コンフリクトが起きたら

revert中にコンフリクトが起きることがある。

# コンフリクトを解決後
git add .
git revert --continue

# やっぱりやめる
git revert --abort

間違えてresetした場合

reflogに30日間残っている。

# 操作履歴を確認
git reflog

# 特定の状態に戻す
git reset --hard HEAD@{1}

ただし--hardで消したファイル変更は戻らない。


判断フローチャート

push済み?
├── はい → revert
└── いいえ
    └── 変更を残したい?
        ├── はい → reset --soft
        └── いいえ → reset --hard

まとめ

  • push前はreset、push後はrevert
  • 迷ったらrevert(安全)
  • force pushはチーム全員を巻き込む
  • 「履歴を綺麗に」より「誰も困らない」を優先
  • 間違えたらreflogで復元を試みる