FOR LEARNERS学習中向け

D開発の道具段2構成層運用

Git で間違えたときの直し方|revert・reset・reflog を「共有済みか」で使い分ける運用

Git で間違えたときの直し方|revert・reset・reflog を「共有済みか」で使い分ける運用

Git に慣れてきて、初めて「間違えたコミットをした」「消してしまったかもしれない」場面に出会ったとき、検索結果には revert・reset・restore・reflog が並びます。どれが安全でどれが履歴を壊すのか分からず、reset --hard が怖くて手が止まる。この記事は、その選び方を一本の基準にまとめます。ブランチやマージの意味はすでに分かっている前提で、「間違えたあと」だけを扱います。

この記事の結論

  • 直し方は、そのコミットを他の人が受け取っているかで決めます。
  • 共有前なら、reset で枝の指す先を動かします。手元だけの話なのでやり直しが効きます。
  • 共有済みなら、revert で打ち消しのコミットを足します。履歴は書き換えません。
  • reset –hard と restore は、未コミットの変更を捨てます。実行前に状態を見ます。
  • 消えたように見えても、reflog に動きの記録があり、既定では一定期間は戻せます。
  • 直した内容は、あとで読める形(コミットメッセージ)に残します。

間違えたとき最初に見るものは何か|状態と履歴を確かめる

最初にやるのは直すことではなく、見ることです。慌てて操作を重ねると、元の状態が分からなくなります。

git status          # 作業ツリーとステージの状態
git log --oneline -5   # 直近のコミット
git branch -vv      # 枝がどのリモートの枝を追っているか

見るのは3点です。

  1. 未コミットの変更があるか。 あるなら、これから使う操作で消えないかを先に考えます。
  2. 間違えたコミットはどれか。 直前の1つか、少し前か。マージコミットか。
  3. そのコミットはもう共有したか。 git branch -vv の表示や、リモートの枝との差を見て、push 済みかを確かめます。push していても、誰も取り込んでいないとは限りません。迷ったら「共有済み」として扱うのが安全です。

この3つが分かれば、使う道具はほぼ決まります。

直す前の流れ

道具を選ぶ前に、状態を見て共有したかを確かめる

  1. 気づく

    間違いに気づいて手を止める

  2. 見る

    status と log で状況を見る

  3. 共有したか

    push・取り込みの有無

  4. reset か revert

    手元だけ→reset/共有済み→revert

  5. 確かめる

    log で結果を見る

CHECK 1ここまでの確認

すでに push して他の人が受け取ったかもしれないコミットを取り消すとき、向いているのはどちらか?

答えと解説

答え: 2. revert で打ち消しのコミットを足す

revert は履歴を書き換えず、打ち消しを新しいコミットとして足します。受け取った人の履歴と食い違いません。読み直す場所は「共有したあとなら」です。

共有する前ならどうするか|reset で枝を動かす

ブランチは、コミットを指す軽い「しおり」でした。reset はこのしおりの指す先を別のコミットに動かす操作です。まだ手元にしか無いコミットなら、しおりを戻すだけで「無かったこと」にできます。

git reset --soft HEAD~1    # 直前のコミットだけ取り消す。変更はステージに残る
git reset HEAD~1           # --mixed(既定)。変更は作業ツリーに残る
git reset --hard HEAD~1    # 変更ごと捨てる

HEAD~1 は「1つ前のコミット」です。違いは、どこまで巻き戻すかにあります。

種類 枝の指す先 ステージ 作業ツリー(ファイルの中身)
--soft 戻る そのまま残る そのまま残る
--mixed(既定) 戻る 戻る(コミット前の状態) そのまま残る
--hard 戻る 戻る 戻る=変更が消える

reset の3段

reset は どこまで戻すかを soft・mixed・hard で選ぶ

  1. soft

    コミットだけ戻る

    変更はステージに残る

  2. mixed

    コミットとステージが戻る

    変更は作業ツリーに残る(既定)

  3. hard

    作業ツリーまで戻る

    未コミットの変更が消える

コミットの文面を直したいだけ、コミットを分け直したいだけなら --soft か --mixed で足ります。ファイルの中身が残るので失うものがありません。--hard だけが作業ツリーまで書き換えるので、まだコミットしていない変更が混ざっているときは使う前に git status で確かめます。

reset は「履歴を書き換える」操作でもあります。共有前なら自分しか困りませんが、すでに他の人が受け取ったコミットを reset で消して push し直すと、相手の履歴と食い違います。次の節の revert が必要になるのはこの場面です。

CHECK 2ここまでの確認

revert を実行したあと、履歴に新しく残るものは何か?

答えと解説

答え: 1. 元の変更を打ち消す内容の新しいコミット

元のコミットは履歴に残ったまま、その逆の変更を持つコミットが1つ増えます。履歴は消さずに足す方式です。

共有したあとならどうするか|revert で打ち消しを足す

git revert は、指定したコミットの変更を打ち消す内容の新しいコミットを作ります。元のコミットは履歴に残ります。Git の公式ドキュメントも、revert は既存のコミットを取り除くのではなく、打ち消しを足すものだと説明しています。

git revert <コミットID>

履歴は次のように伸びます。

操作 履歴の変化 受け取った人の履歴との関係
reset 枝が指す先が戻り、後ろのコミットは枝から外れる 食い違う(共有済みでは避ける)
revert 打ち消しのコミットが1つ増える 食い違わない(そのまま取り込める)

共有前と共有後

手元だけなら reset、共有したなら revert

共有前(手元だけ)

reset:枝の指す先を動かす

  • 枝が1つ前を指す
  • やり直しが効く
  • push し直すと相手と食い違う

共有後

revert:打ち消しを足す

  • 打ち消しのコミットが増える
  • 元の履歴は残る
  • 受け取った人がそのまま取り込める

マージコミットを revert するとき

マージコミットは親が2つあるため、どちらの親の側に戻すのかを -m で指定します。

git revert -m 1 <マージコミットID>

-m 1 は、1番目の親(多くの場合、取り込み先の枝の側)を「残す側」とする指定です。どの親が何かの判断は公式ドキュメントの -m の説明で確かめてください。あとで同じ枝をもう一度マージしたいときは、revert した変更が効いている点にも注意が必要です。ここは扱いが込み入るので、必要になったときに公式へ当たります。

秘密情報を push してしまったとき

revert は履歴を消しません。パスワードやアクセスキーを含むコミットを push した場合、revert しても元のコミットから読めます。認証情報を先に無効化するのが第一です。履歴からの除去の手順は GitHub の公式ドキュメントで確かめてください。

CHECK 3ここまでの確認

reset --hard で枝が戻ったあと、前の位置を探す手がかりになるのはどれか?

答えと解説

答え: 2. reflog

reflog は枝や HEAD が指す先の動きを記録しています。コミット済みの分ならそこから位置を見つけられます。読み直す場所は「消えたと思ったら」です。

消えたと思ったら? reflog とは何か|動きの記録と残る期間

reset --hard のあとにコミットが一覧から消えると、失ったように見えます。けれど、Git は枝や HEAD が指す先の動きを reflog に記録しています。

git reflog

出力には、HEAD が過去にどのコミットを指していたかが新しい順に並びます。戻したい時点の ID が見つかれば、そこへ枝を動かせます。

git reset --hard <reflog で見つけた ID>

reflog の記録は永遠ではありません。公式ドキュメントによると、既定の保持は、枝から到達できるものが90日、到達できなくなったものが30日です。設定で変わるので、自分の環境の値は設定を確かめます。

注意が2つあります。

  • reflog は自分のリポジトリの手元の記録です。別の人のクローンや、リモートの側には同じものがありません。
  • 記録されるのはコミットした内容だけです。コミットしていなかった変更は reflog に入らないので、reset --hard で捨てると戻せません。

CHECK 4ここまでの確認

未コミットの変更を捨てる操作の前に、まずやることは何か?

答えと解説

答え: 2. status などで捨てる中身を確かめる

未コミットの変更は履歴に入っていないので、捨てると reflog にも残らず戻せません。実行前に中身を見ます。

作業中の変更を戻すには|restore と stash の使いどころ

コミットの前の、作業ツリーの変更を戻す道具もあります。

道具 何をするか 変更は残るか
git restore <ファイル> ファイルをステージ(または HEAD)の状態に戻す 捨てる(戻せない)
git stash 変更をいったん脇に退避して、作業ツリーをきれいにする 残る(あとで取り出せる)

迷うなら stash を先に使います。退避なら、あとで必要だと気づいても取り出せます。restore は捨てる操作なので、実行前に git status と git diff で、何が消えるかを見ます。

運用の約束事は何か|main を守る・force push しない・理由を残す

道具の使い分けに加えて、チームで間違いを小さくする約束事があります。

  1. main に直接 push しない。 ブランチとプルリクエストを通せば、間違いが main に入る前にレビューで止められます。
  2. 共有済みの履歴に force push しない。 reset で戻した枝を push し直す操作は、受け取った人の履歴を壊します。やむを得ないときは、影響する人に先に伝えます。
  3. 直した理由をコミットメッセージに残す。 revert のメッセージには、何を打ち消したか・なぜかを書きます。あとで履歴を読む人が、打ち消しの意図を追えます。
  4. 直す前に状態を確かめる。 status と log を見てから操作します。

Cloudory 執筆者(AWS 認定 全冠)

基準は1つです。「そのコミットを、誰かがもう受け取っているか」。受け取っていなければ reset、受け取っていれば revert。迷ったら revert を選べば、履歴が壊れることはありません。

まとめ

  • 間違えたら、まず status と log で見て、共有したかを確かめる。
  • 共有前は reset(soft / mixed / hard で戻す範囲を選ぶ)、共有後は revert。
  • 消えたように見えても、コミット済みなら reflog から探せる。保持は既定で90日(到達可能)と30日(到達不能)。
  • 未コミットの変更を捨てる操作は、実行前に中身を確かめる。
  • 次は、間違いが main に入りにくくなる仕組みとして、CI/CD を読むとつながります。

READ ALSO — 学習中向け・段2 構成 CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由

参照ソース

  • git-revert Documentation — revert が打ち消しのコミットを足して履歴を保つこと、reset との違い、マージコミットの -m(2026-10 時点)
  • git-reflog Documentation — reflog が参照の動きを記録すること、既定の保持(到達可能 90 日・到達不能 30 日)の根拠
  • git-reset Documentation — reset の soft / mixed / hard が戻す範囲の根拠

SCOREこの記事の確認テスト

0/4問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

HAND IT OVER人に渡すなら

一言で説明するなら

Git の取り消しは、配った書類の訂正に似ています。まだ手元だけなら破って書き直せますが、配ったあとは「訂正の紙」を足して回すしかありません。

FAQよくある質問

reset と revert はどちらを使えばよいですか?

そのコミットを他の人が受け取っているかで決めます。手元だけなら reset、共有済みなら revert が基本です。

reset --hard をしてしまいました。戻せますか?

コミット済みの分は、reflog に動きの記録が残っている間は位置を探して戻せます。まだコミットしていなかった変更は履歴に入っていないので戻りません。

間違えて push した秘密情報は revert で消えますか?

消えません。元のコミットは履歴に残ります。認証情報を先に無効化することを優先し、履歴からの除去の手順は GitHub の公式ドキュメントで確かめてください。

次に何を学べばよいですか?

ブランチ保護とプルリクエストのレビューで間違いが main に入りにくくする方法と、CI/CD でテストを自動で回す仕組みです。

SAME TRACK同じ領域の記事

JSON と YAML の読み方|設定ファイルが「入れ子の名前と値」でできている仕組み
JSON と YAML の読み方|設定ファイルが「入れ子の名前と値」でできている仕組み 段0 土台仕組み
Git とは何か|「上書き保存」と「版を残す」の違いを、最初の3つの動作で理解する
Git とは何か|「上書き保存」と「版を残す」の違いを、最初の3つの動作で理解する 段0 土台とは
Git のブランチとマージの仕組み|main を直接触らない理由と、プルリクエスト・衝突の意味
Git のブランチとマージの仕組み|main を直接触らない理由と、プルリクエスト・衝突の意味 段1 入口仕組み