Gitで過去の状態に戻す場合、主に「git reset」と「git revert」の2つのコマンドを使用します。ここでは「git reset」について詳しく説明し、その3つのモード(--soft, --mixed, --hard)を紹介します。
例として、changed.shというファイルを変更してコミットした後、その変更を取り消したいと仮定します。
HEADは現在位置を指します。HEAD^1は直前のコミット、HEAD^2はさらに前になります。
1. --soft モード
--softオプションを使うと、HEADポインタを指定したコミットに移動しますが、インデックス(ステージングエリア)には変更が残ります。つまり、取り消されたコミットの変更内容がそのままステージングエリアに保持されます。
$ git reset --soft HEAD^1
$ git status
ブランチ main 上
最新の 'origin/main' と同じです
次のようにコミットする変更があります:
("git restore --staged <ファイル>..." を使用してステージ解除)
変更: changed.sh
2. --mixed モード(デフォルト)
--mixedモードでは、HEADポインタを移動させますが、作業ディレクトリ自体には影響を与えません。このため、取り消されたコミットの変更内容は作業ディレクトリにそのまま残ります。
$ git reset --mixed HEAD^1
$ git status
ブランチ main 上
最新の 'origin/main' と同じです
次の変更はまだステージされていません:
("git add <ファイル>..." を使用して更新)
("git restore <ファイル>..." を使用して破棄)
変更: changed.sh
デフォルトでは--mixedが使われるので、引数なしでも同じ結果となります。
3. --hard モード
--hardモードは最も強力な方法です。このモードでは、HEADポインタを移動させるだけでなく、作業ディレクトリやステージングエリアも指定したコミットの状態に完全に戻します。これにより、取り消されたコミット以降の変更はすべて失われます。
$ git reset --hard HEAD^1
$ git status
ブランチ main 上
最新の 'origin/main' と同じです
注意点として、--hardを使用すると取り消された変更は元に戻せなくなりますので、慎重に扱う必要があります。