Git Reset
最終更新
git reset は現在のブランチを別のコミットへ移動し、モードに応じてステージングエリア(インデックス)とワーキングツリーをそれに合わせて更新します。3 つのモードは、その更新がどこまで及ぶかだけが異なります。--soft はブランチを移動して停止し、--mixed(デフォルト)はさらにステージングエリアもリセットし、--hard はさらに作業ファイルも上書きします。
--hard はコミットしていない作業を破棄するため、実行前にどのモードが必要かを把握しておきましょう。これらのコマンドはターミナルプレイグラウンドで安全に試せます - ブラウザ内の本物のシェルです。
3 つのモード
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | はい | いいえ | いいえ |
--mixed (default) | はい | はい | いいえ |
--hard | はい | はい | はい |
構文
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | 直前のコミットを取り消し、変更はステージしたまま残す |
git reset HEAD~1 | 直前のコミットを取り消し、変更をステージから外して残す |
git reset --hard HEAD~1 | 直前のコミットを取り消し、変更を破棄する |
git reset <file> | ファイルをステージから外す(変更は保持) |
git reset --hard origin/main | ローカルブランチをリモートに強制的に一致させる |
よくあるケース
| Goal | Command |
|---|---|
| すべてをステージから外す | git reset |
| ファイル 1 つをステージから外す | git reset README.md |
| 3 コミット戻して作業を保持する | git reset --soft HEAD~3 |
| あるコミット以降のローカル変更をすべて破棄する | git reset --hard <hash> |
Git reset のよくある質問
--soft、--mixed、--hard の違いは何ですか?
3 つともブランチのポインタを対象のコミットへ移動しますが、ほかに何を変更するかが異なります。
--soft はそれ以外を何も変えないため、変更はステージされたまま残ります。--mixed(デフォルト)はさらにステージングエリアもクリアするので、変更はステージから外れますがファイルには残ります。--hard はさらにワーキングツリーを対象のコミットに合わせて上書きし、コミットしていない変更を破棄します。git reset でファイルをステージから外すには?
git reset <file>(例: git reset README.md)を実行するか、パスを指定せずに git reset を実行してすべてをステージから外します。これはファイルをステージングエリアから取り除きますが、ワーキングツリーの編集内容は保持します。新しい Git では git restore --staged <file> も使え、同じことをより明示的に行えます。git reset --hard は元に戻せますか?
ワーキングツリーからは戻せません -
--hard はコミットしていない変更を完全に破棄します。ただし、reset で消したコミット済みの作業は通常復元できます。git reflog を実行してコミットのハッシュを見つけ、git reset --hard <hash> を実行します(またはそこにブランチを作成します)。一度もステージやコミットをしていない変更は復元できないため、--hard は慎重に使ってください。git reset と git revert の違いは何ですか?
git reset はブランチを後戻りさせて履歴を書き換えます - ローカルのコミットには問題ありませんが、すでに push したコミットでは危険です。git revert は履歴をそのまま残し、以前のコミットを打ち消す新しいコミットを追加するため、共有ブランチには安全な選択肢です。これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ内の本物のシェルで
git reset を実行できます - インストールは不要です。Coddy の無料インタラクティブ Git コースでも、リセットや変更の取り消しを段階的に扱っています。