🔖

Git初心者のための git reset オプション完全解説

に公開

はじめに

Gitを使用していて「コミットを戻したい」「変更を取り消したい」と思ったとき、git resetを使います。
その際使われるのが、 --soft / --mixed/ --hardという3つのオプションです。
これらの違いを理解せずに使ってしまい、ファイルが消えたり、変更が元に戻っていたりして慌てた経験をした方も多いのではないでしょうか。

本記事では、この3つのオプションの違いと、それぞれの安全な使い分け方を解説します。

git resetとは

コミット履歴(HEAD)や作業ツリー(Working Tree)、ステージ(Index)をどう書き換えるかを制御するコマンドです。
変更を“なかったこと”にできますが、使用するオプションによって影響を受ける範囲が大きく異なります。

用語補足

用語 説明
コミット履歴(HEAD) 現在のコミット(履歴の最新地点)
ステージ(Index) git add で一時保存された、コミット準備中の状態
作業ツリー(Working Tree) ファイルを直接編集しているローカルの状態

--soft, --mixed, --hardの違い

オプション HEAD(履歴) ステージ(git add 済) 作業ツリー(ファイルの編集)
--soft 過去に戻る 保持(ステージされたまま) 保持(編集も残る)
--mixed(デフォルト) 過去に戻る リセット(ステージ解除) 保持(編集も残る)
--hard 過去に戻る リセット(ステージ解除) リセット(編集も消える)⚠️

用途

  • --soft:履歴(HEAD)だけを戻すため、コミットをやり直したいときに便利です。
  • --mixed:ステージの状態を解除し、作業ツリーはそのまま。git add を取り消したいときに適しています。
  • --hard:全ての状態(履歴・ステージ・作業ツリー)を完全にリセットします。慎重に使用しましょう。

使用例

--soft
コミットメッセージを間違えたとき

git reset --soft HEAD^
git commit --amend

--mixed
git addしたけどやめたいとき

# git reset --mixedと同じ意味
git reset

--hard
ブランチが煩雑になっているので、全てリセットしたいとき

# origin/main の状態に完全に巻き戻します(ローカル変更は全て消えます)
git reset --hard origin/main

※ ただし--hard は要注意。git stash で一時保存してから行う。

resetrevertの違い

  • reset:履歴を書き換える(ローカル専用)
  • revert:新しいコミットで取り消す(安全・共有向け)

🚨 共有ブランチでは git reset を使うと他の人の履歴にも影響を及ぼすがあります。
→ 基本的に reset はローカル作業用、revert は共有ブランチ用 と覚えましょう。

まとめ

git resetは便利ですが、使い方を間違えると取り返しがつかないこともあります。

まずは --soft で様子を見る
→ それでも不要なら --mixed
→ 最終手段として --hard は慎重に。

Git操作で困ったときは、まず履歴を消さずに安全な方法から試すことをおすすめします。

Discussion