はじめに
プログラミング学習中はgit reset を使用してこなかった私。
業務の中でこちらのコマンドを使用する機会があったので、
参考記事をもとに、学習記録として「何がどう変わるのか」をまとめ、
--soft / --mixed / --hard の違いの理解を深めたいと思います。
対象読者
-
git resetの理解を深めたい初学者の方 - 参考記事がある程度まとまっていたらいいのにな、と思っている方
✅ そもそも git reset は何をするの?
Gitには3つの「記録レベル」があるそうです
| レベル | 名前 | 例えると |
|---|---|---|
| ① リポジトリ(commit) | HEAD |
完成品の倉庫 |
| ② ステージングエリア(index) |
git add したもの |
出荷前に箱詰めしたもの |
| ③ 作業ディレクトリ(working directory) | 手元のファイル | 実際に編集してるファイル |
✅ git reset の種類と違い
それぞれ「どこまで巻き戻すか」に違いが。
| オプション | 巻き戻される場所 | ステージングにある? | ファイルは元のまま? | 使いどころ |
|---|---|---|---|---|
--soft |
✅ HEAD(commit)だけ戻す | ✅ ステージングはそのまま | ✅ ファイルもそのまま | コミットだけやり直したい |
--mixed(デフォルト) |
✅ HEAD + ステージング戻す | ❌ ステージング解除 | ✅ ファイルはそのまま | addしたけどやっぱりやめたい |
--hard |
✅ すべて戻す(HEAD + ステージング + ファイル) | ❌ ステージング解除 | ❌ ファイルも消える | 完全に巻き戻したい(注意!) |
✅ イメージ(※実際のファイルの状態)
例:今の状態
作業ファイル(編集済) → git add → git commit した直後
🔸 git reset --soft HEAD~1
- コミットだけ取り消す
- でも
git addした状態(ステージング)はそのまま!
HEAD ← 戻る
ステージング ← 残る
作業ファイル ← 残る(編集済)
👉 「コミットしてしまったが、メッセージ変えたい」とき便利!
🔸 git reset --mixed HEAD~1(※デフォルト)
- コミット取り消し
- ステージングも解除(addなかったことに)
- でもファイル自体はそのまま
HEAD ← 戻る
ステージング ← 空になる
作業ファイル ← 残る(編集済)
👉 「addしすぎた!」ってときに便利!
🔸 git reset --hard HEAD~1
- コミットもステージングも作業もぜんぶ戻る(編集内容消える)
HEAD ← 戻る
ステージング ← 空になる
作業ファイル ← 戻る(編集前に戻る)
⚠️ 注意:手元の編集ファイルも完全に消えます!
まとめ
| コマンド | 意味 |
|---|---|
--soft |
コミットだけ巻き戻し。add はそのまま |
--mixed |
add もやめる。ファイルはそのまま |
--hard |
全部巻き戻す(元に戻す)=慎重に⚠️ |
まとめ
よく分からないときは -soft または -mixed を使う、ではなく、状況を整理して使い分けができるようになりたいと思っています。
最後までおよみいただきありがとうございます。
参考記事など
図解で示してあるものや漫画調のもの、自分の状況に合わせてどのコマンドを使えばいいのか分かりやすくなっているものなど、様々。重宝しています。ありがとうございます。