
はじめに
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
、--hard
の3つのモードによって異なります。
git resetが活躍する場面
以下のような場面では、git reset
がとても役立ちます。
- プッシュ前のローカルコミットの整理
- 履歴の簡素化による開発効率の向上
- 作業のひとつ前の状態への巻き戻し
- ステージングエリアからの変更の取り消し
- コミットメッセージの修正
このように、主にローカルでの作業を整理・修正する場合にgit reset
は威力を発揮します。
コミットの取消し:git resetとgit revertの違い
git reset
と git 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つのステップで進めるとスムーズです。
- コミット履歴を確認して対象を特定
- 適切なモードで
git reset
コマンドを実行 - 結果を確認して動作を検証
それぞれの手順を詳しく見ていきましょう。
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やデータベース操作など、今後のキャリアに活かせる学習コースも豊富に用意されています。
エンベーダーの学習コース一覧
いくつかのコースは無料で体験できるため、「コマンドに慣れたい」「楽しくGitを身につけたい」という方は、ぜひ一度エンベーダーを試してみてください。
この記事で学んだこと
この記事では、git reset
の基本的な使い方から、3つのモードの違い、実務で役立つ応用テクニックまでを解説しました。最後に大切なポイントを振り返ります。
-
git resetとは
指定したコミットまで履歴を巻き戻し、それ以降のコミットを削除するコマンドです。
-
git resetの3つのモード
- --soft:コミットの取り消し、変更のステージングエリアへの保持
- --mixed(デフォルト):コミットとステージングの取り消し、変更の作業ディレクトリへの保持
- --hard:すべての変更の完全削除(復元不可)
-
git revertとの使い分け
チーム開発や共有リポジトリでは
git revert
を、個人のローカル作業ではgit reset
を使用することが基本です。2つのコマンドの違いは以下のページで詳しく解説しています。
git revertとgit resetのやり方とは?初心者でも迷わず選べるコミット取り消しの基本
git reset
を使いこなせるようになると、履歴の管理や作業の調整が格段にスムーズになります。
ただし、履歴を改変するコマンドであることを常に意識し、慎重な活用を心がけましょう。
参考資料
以下のリンクは、この記事で解説した手順や概念に関連する参考資料です。より詳しく学びたい方は、ぜひご覧ください。
-
Git公式ドキュメント:git-reset
-
Git公式ドキュメント:Git のさまざまなツール
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

関連記事

2024.04.28
git shortlogとは?git logとの違いを合わせて解説
この解説記事では、git shortlogについて、git logとの違いにもフォーカスを当てて説明していきます。
- git

2024.06.02
Gitコマンド「git fsck」とは?リポジトリの安定を保つサポートツールを紹介
今回は、安定したリポジトリ運用をサポートする「git fsck」を解説します。様々なGitコマンドを習得し、Gitマスターを目指しましょう!
- git

2024.08.24
git checkout と git switch それぞれの使い方を比較する
この記事では、switchコマンドの基本的な使い方と機能を紹介します。また、checkoutコマンドとの比較を行い、両者の違いとそれぞれのコマンドが適した使用状況について解説します。最後に、switchコマンドを使った実践的な使用例とベストプラクティスを提供します。
- PC操作
- git

2023.10.29
Gitの作業効率化!git stash と git diff の使い方を解説
ここでは表題の`git diff`, `git stash` に加え、`git status`という3つの重要なコマンドをそれぞれの使い方や役割、利点について解説します。
- インフラエンジニア
- git