1. ホーム
  2. 記事一覧
  3. 【初心者向け】git resetでコミットを取り消す方法|3つのモードの違いと基本の使い方をわかりやすく解説

2025.06.12

【初心者向け】git resetでコミットを取り消す方法|3つのモードの違いと基本の使い方をわかりやすく解説

はじめに

Gitで作業していると「さっきのコミット、なかったことにしたい」「コミット履歴をきれいに整理したい」と思うことはありませんか?本記事では、コミット履歴を直接書き換えて、過去の状態に戻すことができるgit resetコマンドの使い方を、初心者の方にもわかりやすく解説します。

この記事を読むことで、git resetの3つのモード(--soft--mixed--hard)の違いから、基本的な使い方、さらに間違えてresetしてしまった場合の復元方法まで、段階的に学ぶことができます。git resetを正しく使いこなせるようになると、より柔軟で効率的なGit操作が可能になります。ぜひ一緒に学んでいきましょう。

git resetとは

git reset は、コミットを取り消すためのGitコマンドの一つです。具体的には、指定したコミット以降の履歴を削除し、ブランチの状態を過去に戻す操作を行います。

作業をやり直したいときや、不要なコミットを整理したいときに使われますが、履歴そのものを書き換えるため慎重な扱いが必要です。

この「コミットを取り消す」という操作が、実際にどのように行われるのかを見ていきましょう。

git resetのコミットを取り消すとは

git reset によるコミットの取り消しとは、現在のブランチの先頭HEADを、指定した過去のコミットに戻す操作を指します。これにより、それ以降のコミットは履歴上から削除されます

たとえば、コミット履歴が A → B → C の順になっている場合、コミットCを git reset で取り消すと、Cは削除されて HEAD はBを指す状態になります。

なお、削除されたコミットの内容がどの段階まで残るかは、--soft--mixed--hard3つのモードによって異なります。

git resetが活躍する場面

以下のような場面では、git resetがとても役立ちます。

  • プッシュ前のローカルコミットの整理
  • 履歴の簡素化による開発効率の向上
  • 作業のひとつ前の状態への巻き戻し
  • ステージングエリアからの変更の取り消し
  • コミットメッセージの修正

このように、主にローカルでの作業を整理・修正する場合にgit resetは威力を発揮します。

コミットの取消し:git resetとgit revertの違い

git resetgit revert は、どちらもコミットを取り消すためのコマンドですが、仕組みと使い方が大きく異なります。

もう一つの取り消しコマンドである git revert は、指定したコミットの変更を取り消すための新しいコミットを作成します。「履歴を壊さずに」変更を取り消し、履歴の整合性を保ったまま安全に操作できるため、共有リポジトリやチーム開発において特に有効な方法です。

どちらを使うべきか迷ったときの判断基準については、以下の記事で詳しく解説しています。

git revertとgit resetのやり方とは?初心者でも迷わず選べるコミット取り消しの基本

https://envader.plus/article/244

git resetの3つのモード

git resetには、変更内容の扱い方が異なる3つのモード--soft--mixed--hard)があります。各モードの特徴を理解することで、状況に応じた適切な使い分けができるようになります。

--softモード

--softモードは、コミットだけを取り消し、変更内容はステージングエリアに残す動作をします。

このモードは、以下のような場面で便利です。

  • コミットメッセージの修正
  • 複数のコミットのまとめ直し

作業内容はそのまま残っているので、すぐに新しいコミットをやり直すことができます。

git reset --soft HEAD~1

--mixedモード(デフォルト)

--mixedモードは、コミットとステージングを取り消し、変更内容はワーキングディレクトリに残す動作をします。これは、git reset をオプションなしで実行したときのデフォルトモードです。

以下のような場面で使用します。

  • ステージングをやり直したい場合
  • コミットの取り消し後に、内容を再確認したい場合
git reset --mixed HEAD~1
# または省略形
git reset HEAD~1

--hardモード

--hardモードは、コミット、ステージング、ワーキングディレクトリのすべてを完全に削除します。

以下のような場面で使用します。

  • すべての変更を完全になかったことにしたい場合
  • クリーンな状態に戻してやり直したい場合

注意:このモードは変更内容を完全に失うため、使用には十分な注意が必要です。

git reset --hard HEAD~1

3つのモードの違い

各モードがGitの3つの領域(リポジトリ、ステージングエリア、ワーキングディレクトリ)にどのような影響を与えるかを理解することが重要です。

モードコミット履歴ステージングエリアワーキングディレクトリ
--soft削除される変更が残る変更が残る
--mixed削除される削除される変更が残る
--hard削除される削除される削除される

次は、これらのモードを実際に使うときの基本的な操作方法を見ていきましょう。

git resetの使い方

git resetの基本的な使い方は、取り消したいコミットを指定して実行します。

git reset [オプション] <対象のコミット>

この操作は、以下の3つのステップで進めるとスムーズです。

  1. コミット履歴を確認して対象を特定
  2. 適切なモードで git reset コマンドを実行
  3. 結果を確認して動作を検証

それぞれの手順を詳しく見ていきましょう。

1. コミット履歴の確認方法(git log --oneline)

まずは、どのコミットまで戻すかを判断するために、コミット履歴を確認します。

git log --oneline

実行結果の例:

a1b2c3d (HEAD -> main) コミットC:Good Night を追加
8h9i0j1 コミットB:Good Morning を追加
2k3l4m5 コミットA:Hello World を追加

左側の英数字(コミットハッシュ)が、git resetの対象として使える識別子です。

2. git resetコマンドの実行

実行方法は、「どのコミットまで戻すか」と「どのモードを使うか」の2点を意識することがポイントです。

2-1. 直前のコミットをresetする方法

直前のコミットを取り消したい場合は、HEAD~1またはHEAD^を指定します。

# コミットのみを取り消す(--soft)
git reset --soft HEAD~1

# コミットとステージングを取り消す(--mixed / デフォルト)
git reset HEAD~1

# すべての変更を取り消す(--hard)※要注意
git reset --hard HEAD~1

2-2. 特定のコミットまでresetする方法

過去の特定のコミットに戻したい場合は、git logで確認したコミットハッシュを指定します。

# コミットハッシュを指定
git reset --mixed 2k3l4m5

# 相対的な指定(3つ前のコミットまで戻る)
git reset --mixed HEAD~3

--soft--hard モードに切り替える場合も、同様に指定できます。

3. 結果を確認して動作を検証

git resetの実行後は、変更が正しく反映されたかを確認します。

# 現在の状態を確認
git status

# コミット履歴を確認
git log --oneline

# 変更内容の詳細を確認
git diff

各モードによって、git statusの結果が異なることを確認してください。

ここまでで、基本的な使い方の流れはつかめたかと思います。次は、git resetでよく使うオプションについて見ていきましょう。

git resetのオプションの紹介

git resetをより柔軟に使いこなすためには、状況に応じたオプションの活用が重要です。ここでは、よく使われる代表的なオプションを一覧で紹介します。

オプション主な効果よく使われる場面
--softコミットのみを取り消すコミットメッセージの修正、複数コミットのまとめ直し
--mixedコミットとステージングを取り消すステージの修正、やり直し
--hardすべての変更を完全に削除する作業内容の完全な破棄(※注意が必要)
--keepローカル変更を保持しつつ戻すマージ作業中に安全に巻き戻したいとき
--mergeマージ前の状態に戻すコンフリクト発生時にマージ前へ戻したいとき

すでに --soft / --mixed / --hard の3つは前のセクションで紹介しましたので、ここでは --keep--merge の2つを取り上げます。

--keep オプション

ローカルに未コミットの変更がある状態で、マージなどの操作を取り消したいが、変更内容は残したいというときに使います。

git reset --keep HEAD~1

このオプションは、安全にリセットを行いたいときに有効です。マージ作業をやり直したいけれど、手元の変更は失いたくない場合に活躍します。

--merge オプション

マージ作業中にコンフリクト(衝突)が発生し、マージを中断して、マージ前の状態に戻したいときに使用します。

git reset --merge ORIG_HEAD

--mergeは、特にマージのやり直しや整理をしたいときに便利なオプションです。

このように、git reset のオプションを理解しておくと、さまざまな状況で柔軟に履歴や状態を操作できます。

git resetの使い方ハンズオン

実際にgit resetを使って、各モードの動作を体験しながら理解を深めていきましょう。

1. テスト用のリポジトリを作成

まずはテスト用のローカルリポジトリを作成します。

# 新しいディレクトリを作成
mkdir git-reset-test
cd git-reset-test

# Gitリポジトリを初期化
git init

# hello.txtファイルを作成・Hello Worldを追加してコミット
echo "Hello World" > hello.txt
git add hello.txt
git commit -m "Hello World を追加"

# 2つ目の変更をコミット
echo "Good Morning" >> hello.txt
git add hello.txt
git commit -m "Good Morningを追加"

# 3つ目の変更をコミット
echo "Good Night" >> hello.txt  
git add hello.txt
git commit -m "Good Nightを追加"

2. 現在の状態を確認

次に、ファイルの中身とコミット履歴を確認して、reset前の状態を把握しておきましょう。

# ファイルの内容を確認
cat hello.txt

# コミット履歴を確認
git log --oneline

出力結果の例:

# ファイルの内容を確認
cat hello.txt
Hello World
Good Morning
Good Night
# コミット履歴を確認
git log --oneline
a3c8f11 (HEAD -> main) Good Nightを追加  
d6b2e47 Good Morningを追加  
f4e3c1a Hello World を追加

3. --softモードでreset

まず、--softモードで直前のコミットを取り消してみます。

git reset --soft HEAD~1

実行後の確認:

# ステータスを確認
git status

出力結果:

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   hello.txt

変更内容がステージングエリアに残っていることが確認できます。

4. --mixedモードでreset

次に、--mixedモード(デフォルト)でresetの動作を確認します。

4-1. 先ほどのコミットを再度適用

まず、--soft モードで取り消したコミット内容がステージングエリアに残っている状態です。この変更を使って、改めてコミットを作成し直します。

# 変更を再度コミット
git commit -m "Good Nightを追加し直し"

これで、再びコミットが復元された状態になりました。

4-2. --mixedモードでresetを実行

次に、--mixed モードで直前のコミットを取り消します。

このモードでは、コミットとステージングが取り消され、変更内容は作業ディレクトリに残ります。

# --mixedモードでreset(HEAD~1)
git reset HEAD~1

実行後の確認:

# ステータスを確認
git status

出力結果:

On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   hello.txt

変更内容が作業ディレクトリに残り、ステージングから外れていることが確認できます。

5. --hardモードでreset

最後に、--hardモードの動作を確認します。

このモードでは、コミット、ステージング、作業ディレクトリすべての変更が完全に削除されます。

注意:この操作は取り消せません。本番作業での使用には十分注意してください。

5-1. 変更の再コミット

前の手順、--mixedモードで取り消した内容を再度コミットし直して、--hardモードでの動作を確認できる状態にします。

# 変更をステージング
git add hello.txt

# 再度コミット
git commit -m "Good Nightを追加し直し(再)"

5-2. 現在のファイルの中身の確認

ファイルの中身を確認して、reset前の状態を把握しておきましょう。

# ファイルの内容を確認
cat hello.txt
Hello World
Good Morning
Good Night

5-3. --hardモードでresetを実行

ここで --hard モードを使って、直前のコミットを完全に取り消します。

# --hardモードでreset
git reset --hard HEAD~1

実行後の確認:

# ファイルの内容を確認
cat hello.txt

出力結果:

Hello World
Good Morning

最後に追加した「Good Night」の行が完全に削除されたことがわかります。

git resetの使い方ハンズオンのまとめ

このハンズオンを通して、git reset の3つのモードの違いを体験できました。

  • --soft:コミットの取り消し、変更のステージングエリアへの保持
  • --mixed:コミットとステージングの取り消し、変更の作業ディレクトリへの保持
  • --hard:すべての変更の完全削除(復元不可)

特に --hard モードは強力な分リスクもあるため、使う前には慎重な確認が必要です。次のセクションでは、実際の開発現場で git reset が役立つ応用的な活用方法を紹介します。

git resetの実務で役立つ4つの応用例

git reset は、履歴の整理や細かい調整など、実務で役立つシーンがたくさんあります。ここでは、初心者でも覚えておくと便利な4つの活用例を紹介します。

1. ステージングエリアから特定のファイルだけを取り除く

複数のファイルを git add したあと、「このファイルだけコミット対象から外したい」という場面では、git reset特定のファイルだけステージングから外すことができます。

# hello.txtだけをステージングから外す
git reset HEAD hello.txt

変更内容はワーキングディレクトリに残ったままなので、あとで再度ステージング・コミットが可能です。

2. ステージングからすべてのファイルをまとめて外す

たとえば、git add . で意図せずすべてのファイルをステージングしてしまったときも、git resetで簡単にやり直せます。

# ステージングからすべてのファイルを外す
git reset

この操作で、作業内容はそのままにステージングのみを解除できます。ステージングのやり直しや、ファイル単位の精査に役立ちます。

3. 複数のコミットをまとめる(コミットの整理)

たとえば、「Hello World」「Good Morning」「Good Night」と3回に分けてコミットしたが、後から1つの機能としてまとめたい場合には以下のように操作します。

# 直近3つのコミットを1つにまとめ直す
git reset --soft HEAD~3

# まとめて再コミット
git commit -m "hello.txtに挨拶文を追加(3コミットを統合)"

プルリクエスト前に履歴を整えたいときなど、レビューのしやすさにもつながります。

4. git resetを取り消す復元方法

git reset でうっかり必要な履歴を消してしまっても、git reflog を使えば以前の状態に戻すことが可能です。

git reflog には、HEAD がどのように移動したかの履歴が記録されています。

# HEADの移動履歴を確認
git reflog

出力例:

# HEADの移動履歴を確認
git reflog
9a8a252 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1
04473f1 HEAD@{1}: commit: Good Nightを追加し直し(再)
9a8a252 (HEAD -> main) HEAD@{2}: reset: moving to HEAD~1
460d0d1 HEAD@{3}: commit: Good Nightを追加し直し
9a8a252 (HEAD -> main) HEAD@{4}: reset: moving to HEAD~1
8584a9b HEAD@{5}: commit: Good Nightを追加
9a8a252 (HEAD -> main) HEAD@{6}: commit: Good Morningを追加

戻したい状態が確認できたら、以下のように復元します。

# 例:1つ前の状態に復元
git reset --hard HEAD@{1}

実行結果の例:

# 例:1つ前の状態に復元
git reset --hard HEAD@{1}
HEAD is now at 04473f1 Good Nightを追加し直し(再)

このように、コミット「Good Nightを追加し直し(再)」の状態に戻せたことが確認できます。

ORIG_HEADを使った復元

git reset を直前に実行したばかりであれば、ORIG_HEAD を使ってより簡単に元の状態に戻すこともできます。

# 直前の状態に戻す
git reset --hard ORIG_HEAD

ORIG_HEADは、直前の HEAD の位置を指しており、resetのような操作を行う前の状態に戻したいときに便利です。

git reflog については以下の記事で詳しく解説しています。reflogの基本的な使い方から、HEAD についてわかりやすく解説していますので、ぜひあわせてご覧ください。

Gitコマンド「git reflog」とは?「HEAD」も併せて解説!

https://envader.plus/article/394

応用を安全に使うためのワンポイント

  • git resetは 履歴の書き換え操作のため、ローカルでの使用が原則
  • プッシュ済みコミットの取り消し時におけるgit revertの活用の検討
  • リモート履歴の強制書き換えによるチームへの影響への配慮

このように、ちょっとした操作から履歴整理まで、git resetを正しく使えば日々の開発がより快適になります。

さまざまなGitコマンドを活用できるようになると、Git操作に自信がつきます。もし、Git操作が不慣れと感じている方には、次に紹介する学習方法がおすすめです。

Gitの使い方を学ぶ:おすすめの学習方法

「Gitの操作、まだちょっと不安かも…」そんな方におすすめなのが、「エンベーダー」です。 Gitの基本コマンドをはじめ、エンジニアに欠かせないLinuxの知識や操作をブラウザ上で気軽に学べる学習サービスです。

環境構築は不要。わずか5秒で学習環境が起動し、実際にコマンドを入力しながら学べるので、ゲーム感覚で楽しくスキルを習得できます

エンベーダー公式サイト - Gitの使い方コース

https://envader.plus/course/5/scenario/1055

ポイント1:コマンド入力はすべてブラウザ上で完結。実際に手を動かして学べます。

ポイント2:入力したコマンドの正誤や解説を、すぐに確認できます。

ポイント3:Gitだけでなく、Linuxやデータベース操作など、今後のキャリアに活かせる学習コースも豊富に用意されています。

エンベーダーの学習コース一覧

https://envader.plus/course

いくつかのコースは無料で体験できるため、「コマンドに慣れたい」「楽しくGitを身につけたい」という方は、ぜひ一度エンベーダーを試してみてください。

この記事で学んだこと

この記事では、git resetの基本的な使い方から、3つのモードの違い、実務で役立つ応用テクニックまでを解説しました。最後に大切なポイントを振り返ります。

  • git resetとは

    指定したコミットまで履歴を巻き戻し、それ以降のコミットを削除するコマンドです。

  • git resetの3つのモード

    • --soft:コミットの取り消し、変更のステージングエリアへの保持
    • --mixed(デフォルト):コミットとステージングの取り消し、変更の作業ディレクトリへの保持
    • --hard:すべての変更の完全削除(復元不可)
  • git revertとの使い分け

    チーム開発や共有リポジトリではgit revertを、個人のローカル作業ではgit resetを使用することが基本です。

    2つのコマンドの違いは以下のページで詳しく解説しています。

    git revertとgit resetのやり方とは?初心者でも迷わず選べるコミット取り消しの基本

    https://envader.plus/article/244

git resetを使いこなせるようになると、履歴の管理や作業の調整が格段にスムーズになります。 ただし、履歴を改変するコマンドであることを常に意識し、慎重な活用を心がけましょう

参考資料

以下のリンクは、この記事で解説した手順や概念に関連する参考資料です。より詳しく学びたい方は、ぜひご覧ください。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 LINE登録で記事を読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事