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 |