sequenceDiagram participant Before as commit-id A participant Working as Working Area participant Staging as Staging(Index) participant HEAD as commit-id B Before->>Working: editing files Working->>Staging: git add Staging->>HEAD: git commit HEAD->>Staging: git reset --soft HEAD~1 HEAD->>Working: git reset --mixed HEAD~1 HEAD->>Before: git reset --hard HEAD~1
✅ 目標
🔧 git reset
とは?
Definition: git reset
git reset
は,HEAD
を移動させ,必要に応じて変更のステージングを解除したり,変更を削除したりするコマンド
--soft
vs --mixed
vs--hard
の比較表
領域 | --soft |
--mixed (デフォルト) |
--hard |
---|---|---|---|
HEAD (コミットポインタ) |
✔️ 移動 | ✔️ 移動 | ✔️ 移動 |
ステージング領域 (Index) | ✅ 保持 | ❌ クリア | ❌ クリア |
作業ディレクトリのファイル | ✅ 保持 | ✅ 保持 | ❌ クリア |
git resetのシーケンス図
以下の図は,異なるgit reset
モードがGitの3つの領域にどのように影響を与えるかを段階的に示したものです:
❓ 本当に git reset --hard
が必要か?
Gitを使用していると,最新のコミットでバグが発生したため,以前のコミットから新しいブランチを作成する必要が出てくることがあります. 例えば,現在のHEAD
の1つ前のコミットからHOTFIX
ブランチを作成したい場合などです.
git reset --hard
とgit switch
を使用することを考えるかもしれませんが,もう一度考えてみましょう.その場合,
git switch -c HOTFIX HEAD~1
の方が良い選択です.
このコマンドの動作
HEAD
の1つ前のコミットからHOTFIX
という名前の新しいブランチを作成- HOTFIXブランチに切り替え
- 現在のブランチとコミット履歴は変更されません
メリット
- 非破壊的:全てのコミットが保持されます
- クリーンな分離:現在のブランチを変更することなく
HOTFIX
に取り組めます
👍 ベストプラクティスのガイドラインまとめ
やりたいこと | 使用するコマンド |
---|---|
コミット履歴を書き換えるが作業内容は保持 | git reset --soft HEAD~1 |
ファイルのステージングを解除し,変更は保持 | git reset --mixed HEAD~1 (デフォルト) |
全ての変更を完全に破棄してリセット | git reset --hard HEAD~1 |
HEAD~1 から新しいブランチHOTFIX を作成して切り替え |
git switch -c HOTFIX HEAD~1 |