間違えてコミットしたとき、どう戻しますか

もう共有したかどうかで戻し方を選ぶ問い。revert は打ち消すコミットを足し、reset は履歴を巻き戻す、の違いで答えます。

こう聞かれます

  • 「間違えてコミットしたとき、どう戻しますか」
  • 「git revert と git reset の違いを説明してください」
  • 「main に push した変更で不具合が出ました。どう戻しますか」

面接官が見ている点

  • 「もう push して共有したか」で戻し方を分けられるか
  • revert は履歴を残したまま打ち消す、reset は履歴そのものを動かす、と仕組みで話せるか
  • 消すつもりのない作業まで消す操作 (--hard) の怖さを分かっているか

短い答え

  • push して共有したあとなら、git revert で、間違えたコミットを打ち消す新しいコミットを足して戻します。
  • まだ手元だけにあるコミットなら、git reset で履歴を巻き戻して作り直すこともできます。
  • コミットする前の直しを捨てるだけなら、git restore で作業ツリーのファイルを元に戻します。

少し詳しい答え

revert と reset を並べて試す

前半で、共有した前提のコミットを revert で打ち消します。後半で、まだ共有していないコミットを reset で取り消します。-n は打ち消しをすぐコミットせず、自分で文を付けてコミットするための指定です。

ターミナル

git init -q -b main demo
cd demo
git config user.name Aya
git config user.email a@x.jp
echo "一行目" > note.txt
git add note.txt
git commit -q -m "一行目を書く"
echo "まちがい" >> note.txt
git commit -q -am "まちがいを足す"
git revert -n HEAD
git commit -q -m "まちがいを戻す"
git log --format=%s
cat note.txt
echo "下書き" >> note.txt
git commit -q -am "まだ共有していない"
git reset -q --soft HEAD~1
git log --format=%s
git status --short
まちがいを戻す
まちがいを足す
一行目を書く
一行目
まちがいを戻す
まちがいを足す
一行目を書く
M  note.txt

revert のあとも「まちがいを足す」は履歴に残り、その上に打ち消すコミットが積まれます。ファイルの中身は一行目だけに戻りました。後半の reset では「まだ共有していない」が履歴から消え、直した中身はステージに載ったまま残っています (M の印)。

なぜ共有したあとは revert か

reset で履歴を巻き戻すと、ほかの人が持っている履歴と食い違います。その状態で無理に push すると、ほかの人の手元とずれて、作業を失わせるおそれがあります。revert なら新しいコミットを足すだけなので、ほかの人は普段どおり取り込めます。

reset の 3 つの強さ

  • --soft 履歴だけを戻し、直した中身はステージに残す
  • --mixed (何も付けないとき) 履歴とステージを戻し、直した中身は作業ツリーに残す
  • --hard 作業ツリーまで戻すので、コミットしていない直しは消える

reset で消えたコミットも、しばらくは git reflog で行き先を探して取り戻せます。

作った物と結ぶなら、たとえば「チーム開発で main に入れた変更が別の画面を壊したとき、revert のプルリクエストを出してまず元に戻し、そのあと原因を直したものを出し直しました」のように話します。

よくある間違い

  • 共有した main で reset して押し通すほかの人の履歴とずれ、作業を失わせるおそれがあります。共有したあとは revert を使います
  • 「revert すると履歴から消える」と言う revert は打ち消すコミットを足すだけで、元のコミットは履歴に残ります
  • 困ったらすぐ reset --hard と答える コミットしていない直しまで消えます。何が消えるかを確かめてから使う、と話します

深掘りの問い

  • 「直前のコミットの文を直したいだけなら」まだ push していなければ git commit --amend で作り直せる、と答えます
  • 「ステージに載せたファイルを外すには」 git restore --staged で外せて、作業ツリーの直しは残る、と答えます
  • 「reset --hard で消したコミットを取り戻せますか」 git reflog で以前の位置を探し、そこへ戻れることが多い、と答えます。コミットしていなかった直しは戻せない、とも添えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る