スキップしてメイン コンテンツに移動

【Day 45】究極の巻き戻しツール(git reset 3兄弟:soft, mixed, hard)

Day 45 アイキャッチ
▲ 【Day 45】究極の巻き戻しツール(git reset 3兄弟:soft, mixed, hard)
👨‍🏫
皆さんこんにちは! 本講座の専任講師です。
前回(Day 44)は、提出前のコミット履歴をピカピカに整頓する git rebase -i と autosquash による自動合体術を学びました。
そして本日の【Day 45】から、いよいよ「第9部:トラブルシューティング&完全復旧術」が開幕します!
その第1弾として、Gitの持つ最も強力で、かつ最も誤解されやすいコマンド【究極の巻き戻しツール(git reset 3兄弟:soft, mixed, hard)】を徹底解説します!
30年選手のベテランエンジニアから、開発現場の切実な悩みが届いています:
「コミットした後に『あ、まだ単体テスト通ってないのにコミットしちゃった』とか『appsettings.Development.json に接続文字列のパスワードを書いたままコミットしてしまった』という事故がよくある。
SVNのRevertは単に作業中の未コミット変更を破棄するだけだったが、Gitの reset はコミット自体を取り消せると聞いた。
でも --soft, --mixed, --hard の3つがあって、どれを使うとせっかく書いたC#コードが消えてしまうのか、どれなら安全なのかが怖くて手が出せない!
それぞれの違いと、現場で安全に使うための判断基準を教えてほしい!」

その恐怖心、非常によく分かります!「reset」という単語の響きが「全消去」を連想させるため、多くのエンジニアが構えてしまいます。
しかし、Gitの「3つの領域(作業ツリー・ステージ・リポジトリ)」の仕組みさえ知ってしまえば、resetは決して恐ろしい破壊コマンドではありません。
むしろ、「間違えてコミットしたコードを1行も消さずに、安全にコミットだけを解体できる」という、SVN時代には夢にも思えなかった最強のセーフティネットなのです!
本日は、reset 3兄弟の違いを図解でスッキリ整理し、C#開発現場での実践シーン、そしてTortoiseGitでの安全な操作法まで完全伝授します!

① なぜresetが怖いのか?Gitの「3つの領域」とresetの本質

SVNユーザーがGitの reset で最も混乱する原因は、「SVNのRevert」と「GitのReset」の意味が全く異なる点にあります。
SVNの svn revert は「コミット前の未コミット作業コピーの変更を破棄する」コマンドでした。
一方、Gitの git reset は「過去に確定したコミット履歴を巻き戻す」コマンドです!

Gitの3つの領域とresetの本質
▲ 【図解①】Gitの3つの領域(作業ツリー・ステージ・リポジトリ)とHEADポインタの巻き戻し

Gitには、Day 05 で学んだ以下の「3つの領域」が存在します:

  1. ① 作業ツリー(Working Tree): エディタやVisual Studioで実際にC#コードを編集しているファイル実体。
  2. ② ステージング領域(Staging / Index): git add で登録した、「次のコミットに含める準備棚」。
  3. ③ リポジトリ(Git Directory / HEAD): git commit で確定保存された、スナップショット履歴の保管庫。

💡 git reset の本質とは?

git reset の本質は、「HEAD(現在見ている最新コミットを指すポインタ)を、指定した過去のコミットへ移動させること」です。
そして、ポインタを過去へ移動させたとき、「取り残されたステージング領域と作業ツリーのファイルをどう扱うか?」によって、3兄弟(--soft, --mixed, --hard)の動作が分かれます!

② `git reset` 3兄弟の徹底比較!どこまで巻き戻すか?

reset には主に3つのオプションがあります。それぞれの違いと影響範囲を図解で比較してみましょう。

git reset 3兄弟の比較と影響範囲
▲ 【図解②】soft / mixed / hard の徹底比較(どこまで巻き戻すか)
オプション HEAD(コミット) ステージ(Index) 作業ツリー(ファイル) 主な利用シーン
--soft 巻き戻る そのまま残る そのまま残る コミットだけ取り消して、メッセージ書き直しや再コミットを行いたいとき
--mixed
(省略時の既定)
巻き戻る 巻き戻る(空になる) そのまま残る 一部のファイルだけコミットから除外したいとき(git add からやり直し)
--hard ⚠️ 巻き戻る 巻き戻る 巻き戻る(変更破棄) 作業を完全に諦めて過去の状態に白紙リセットしたいとき(未保存コードは消滅)

⚠️ 【最重要警告】--hard を使うときの絶対の注意点

--soft と --mixed は、作業ツリーのファイル(あなたが書いたC#コード)には一切手を触れません。そのため、コードが消える心配はゼロです。
しかし、--hard だけは作業ツリーの変更を過去のコミット状態に強制上書きします!
未コミットの変更があった場合、それはGitの履歴にも残っていないため、二度と復元できなくなります。
「作業中のコードを完全に捨て去りたい」という明確な意図がある場合を除き、普段のコミット取り消しでは --soft または --mixed を使うのが鉄則です!

③ C#開発現場での実践シーン:誤コミットからの安全な救出

開発現場で最もよくある「やらかし事故」と、git reset によるスマートな解決手順を見てみましょう。

C#現場での誤コミット救出フロー
▲ 【図解③】C#現場での実践:誤ってコミットした変更をコードを消さずに安全救出

シナリオ:appsettings.Development.json に平文パスワードを書いたまま誤コミット!

C#(ASP.NET Core)でローカル開発中、データベース接続文字列を appsettings.Development.json に書き込み、うっかり新機能コードと一緒にコミットしてしまったとします:

# うっかり機密情報を含めてコミットしてしまった!
$ git commit -m "ユーザー登録ロジックの実装"

まだリモート(GitHub)に git push していない状態なら、慌てる必要はありません!
git reset --soft HEAD~1 を実行します:

# 直前のコミット(HEAD~1)を取り消し、ステージング状態を維持する
$ git reset --soft HEAD~1

コマンドを実行すると、直前のコミットが解体され、変更されたファイル群はすべて「ステージング済み(Staged)」の状態で無傷で手元に残ります!
ここから、機密情報が含まれる設定ファイルだけステージから解除し、安全にコミットし直します:

# 設定ファイルだけステージから降ろす(未ステージ状態にする)
$ git restore --staged appsettings.Development.json

# 機密ファイルを除いたクリーンな状態で再コミット!
$ git commit -m "ユーザー登録ロジックの実装(機密情報除外)"

このように、--soft を使えば、何百行と書いたC#のビジネスロジックは1ミリも消えず、コミットという「包装紙」だけを安全に開けて中身を詰め直すことができます!

④ TortoiseGit / GUI での直感的リセット操作

コマンドラインが苦手なWindows開発者や、視覚的に過去のコミットを確認しながら巻き戻したい場合は、TortoiseGit を使うと極めて直感的に操作できます。

TortoiseGitでの直感的なリセット操作
▲ 【図解④】TortoiseGit / GUI による視覚的・安全なコミット巻き戻し

🖱️ TortoiseGit でのリセット手順

  1. エクスプローラーでプロジェクトフォルダを右クリックし、[TortoiseGit] → [ログを表示] を開きます。
  2. 巻き戻したいコミット(HEADを移動させたい過去のコミット)を右クリックします。
  3. メニューから [このバージョンにリセット(Reset to this commit)...] を選択します。
  4. ダイアログが表示されるので、リセットの種類を選択します:
    • Soft: 変更をインデックスに残す(コミットだけやり直し)
    • Mixed: 変更を作業ツリーに残す(addからやり直し)
    • Hard: すべて破棄(※変更が完全に消えるので注意)
  5. [OK] をクリックすれば、一瞬でHEADが指定位置へ巻き戻ります!

⑤ 現場の絶対鉄則:push済みコミットへのreset禁止とrevertとの使い分け

最後に、開発現場でチーム全員の平和を守るための「絶対の鉄則」を確認しましょう。

🌟 「reset」と「revert」のゴールデンルール

  • まだプッシュしていない(ローカルの)コミット: 自由自在に git reset で巻き戻してOK!
  • すでにプッシュした(GitHub / チーム共有の)コミット: git reset は絶対禁止!Day 43で学んだ git revert を使う!

GitHubにプッシュ済みのコミットに対して git reset を行い、git push --force で歴史を強制上書きしてしまうと、そのブランチから派生して作業していた他のチームメンバーの環境で深刻なコンフリクトが発生します。
「自分の手元にあるうちは reset で完璧に磨き上げ、一度世に出した歴史は revert で紳士的に打ち消す」。
このルールさえ守っていれば、Gitで歴史事故を起こすことは絶対にありません!

📌 本日のまとめ(Day 45 理解のチェックポイント)

  • resetの本質: HEADポインタを過去のコミットに巻き戻す操作である。
  • --soft: HEADだけ戻る。ステージも作業ツリーも無傷で残る(コミットやり直しの最強味方)。
  • --mixed: HEADとステージが戻る。作業ツリーのコードは無傷(既定動作、addからやり直したい時)。
  • --hard ⚠️: HEAD・ステージ・作業ツリーすべて巻き戻す。未コミットの変更は二度と戻らないので厳重注意!
  • C#実践: 誤って機密ファイルを含めても、--soft で解体すればコードを失わずに再コミット可能。
  • チーム鉄則: ローカルの試行錯誤は reset、プッシュ済みの歴史は revert で打ち消す!

次回【Day 46】予告:間違えて削除したコミットや hard reset から奇跡の生還?!
Git最後の命綱「コミット消失からの完全生還(git reflog)」をお届けします。お楽しみに!

コメント

このブログの人気の投稿

【Perfume】Perfume 3rd Tour 「JPN」さいたまスーパーアリーナに行って参りました~

Perfume 3rd Tour 「JPN」1月28日、29日の2daysで参戦して参りました。 ファンクラブ会員の選考抽選会に28日、29日の両日で申し込んでいたんですが、両方とも当選していたという嬉しい誤算。 仕事だぁ、なんだかんだと紆余曲折ありまして28日の参戦は危ぶまれていたのですが、なんとかかんとか28日は40分遅刻しながらも参戦、29日はフル参戦する事が出来ました(∩´∀`)∩

Perfume、2025年末で“コールドスリープ(活動休止)”へ──東京ドーム2daysの記録と、公式・各界・ファンの声

  1) 公式発表・基本情報 活動休止(コールドスリープ)を正式発表 2025年9月21日、公式サイト「 Perfumeより 」で、2026年から一度コールドスリープに入ると発表。再始動の意思(“新しいPerfume”として戻る)も明記。 Perfume Official Site 今後の運用告知(配信・上映など) 同21日付の「 今後のPerfumeに関して 」で、9/23(火・祝)東京ドーム公演の LIVESHIP全世界生配信 および 全国ディレイビューイング 決定を案内。特設サイトも併記。 Perfume Official Site +1 公式グッズ **「Perfume Calendar 2026」**発売決定(B2壁掛け/表紙+2カ月1枚×6枚+ポスター)。テーマは“フルーツ”。 Perfume Official Site 2) 東京ドーム2days(9/22・23)要点 公演タイトル: ZO/Z5 Anniversary “ネビュラロマンス” Episode TOKYO DOME 。日程・開場/開演・会場・物販等の実務情報は特設で公開。 Perfume Official Site 9/23公演を世界配信(LIVESHIP) /ディレイビューイング実施。 Perfume Official Site 海外向け報道(英語)も「 indefinite hiatus 」として広く配信。 The Times of India 国内英字メディアも速報。 朝日新聞 3) 現地レポ( メリ爺 )から見える空気 あなたの現地記録(9/24公開)を、ファクトと現場情景の両面で反映: 両日参戦 。22日は アリーナ 、23日は 1階席から俯瞰 。前日の発表を受け、開演前のザワつき→MC後に“いつもの一体感”へ。開演は22日 18:45 頃。オープニングは**P³ツアー東京ドーム(2020/2)**と同趣向で“回収”の演出。 メリ爺のゲーム万歳 MC所感 :解散ではなく前向きな休止で不安を和らげる内容。 かしゆか の涙、 のっち の気丈さ、 あ〜ちゃん の思い出語り──3人の結束と「 また戻る 」約束が強く刻まれた。 メリ爺のゲーム万歳 体感時間 : “3時間弱”級のボリューム ながら“過去一...

ニンテンドースイッチでオンラインゲームを遊ぶには?

モンスターハンターライズが発売になって、家族でモンハン楽しみたい人が増えたみたいですね。 某ブログの検索キーワードを調べると、モンハンを家族でやるにはどうしたらいいのか?を調べている人が沢山いるのがわかります。 ※これでも一部  家族で協力するにはSwitch2台、ソフトも2つ購入する必要があります。 1台のスイッチでは遊べませんし、ソフト1つでも遊べません。 でも、1台のスイッチで別々アカウントがあれば交代で遊ぶこともできますよ。セーブデータもしっかり分かれます。 Switchのオンラインゲームを家族で遊ぶ方法については以下の記事にまとめてますのでよろしければ参考にしてみてくださいね。 家族でモンスターハンターライズDL版のオンラインプレーを楽しむ方法