※記事内に商品プロモーションを含むことがあります。
はじめに
git reset
コマンドを使って、ローカルリポジトリを過去のコミットに一時的に戻す方法を解説します。この記事では、ソフトウェアの過去のバージョンを再検証する場合を想定しています。
環境:Git for Windows v2.37.2(2)
念のため、実行する前にローカルリポジトリをバックアップすることを推奨します。
過去のコミットに戻す
まず、git checkout
コマンドを使って戻したいコミットがあるブランチに移動します。
git checkout <ブランチ名>
次に、git log
コマンドなどを実行して、最新コミットのハッシュをメモに控えます(リモートリポジトリから確認できる場合は不要です)。これは、最新コミットに戻すためにはそのハッシュが必要になりますが、git reset
コマンドを実行した後は、戻したコミット以降のハッシュが見られなくなるためです。
次に、git reset
コマンドに戻したいコミットのハッシュを付けて実行します。ここで、オプションは--keep
または--hard
のいずれかとします。
git reset --keep <過去のコミットのハッシュ>
git reset --hard <過去のコミットのハッシュ>
全ての変更がコミット済みであれば、--hard
オプションを使います。一方、ソフトウェアの機能に影響がないファイル(ドキュメントなど)に変更を加えており、かつその変更をコミットしていない場合は--keep
オプションを使います。
もし、ソフトウェアの機能に影響があるファイルに変更を加えており、かつコミットしていない状態の場合、先にコミットをしてから--hard
または--keep
オプションを使います。
--keep
よりも--hard
の方が強力であり、--hard
では変更中の内容が破棄されます。
最新のコミットに戻る
過去のコミットから最新コミットに戻るには、同じくgit reset
コマンドを使用します。オプションは過去のコミットに戻ったときと同じものを用います。
git reset --keep <最新コミットのハッシュ>
git reset --hard <最新コミットのハッシュ>
git resetコマンドのオプション
git reset
はHEAD(作業するコミット)の位置を変更するコマンドです。オプションによって、ファイルをどのように変更するか指定します。利用可能なオプションは--hard
, --mixed
, --soft
, --keep
, --merge
の5つです(デフォルトは--mixed
)。以下では--merge
以外の4つのオプションについて述べます。
4つのオプションの違いを表にまとめました(ステージングはgit add
のこと)。コミットした変更があるファイルを過去に戻す必要があるため、--hard
または--keep
オプションとする必要があります(下から3行目)。
ファイル | hard | keep | mixed | soft |
---|---|---|---|---|
ステージング | 戻す | 戻す | 戻す | 戻さない |
コミットした変更 | 戻す | 戻す | 戻さない | 戻さない |
コミットしていない変更 | 破棄 | 残す | 残す | 残す |
追跡していない (Untracked) ファイル | 戻さない | 戻さない | 戻さない | 戻さない |
hard
--hard
オプションを付けると、ステージング (git add
) した変更、ステージングしていない変更も含め、全てのファイルをあるコミットの時点に戻します。ステージングした変更・していない変更の両方とも破棄されます。戻した過去コミットの後に作成してコミットしたファイルは消えますが、git reset --hard <最新コミットのハッシュ>
で復元することが可能です。追跡していないファイルは消えません。
keep
--keep
オプションを付けると、ステージングした変更、およびステージングしていない変更があるファイルは、過去のコミットに戻されません。コミット済みの変更があるファイルのみ過去のコミットに戻されます。戻した過去コミットの後に作成してコミットしたファイルは消えますが、git reset --keep <最新コミットのハッシュ>
で復元することが可能です。追跡していないファイルは消えません。
keepオプションを使うのは、あるファイルの変更をコミットする前で、かつその変更が過去のソフトウェアに影響を与えない場合です。例えば、READMEのようなドキュメントを追記中に、ソフトウェアのみ過去のコミットに戻したい場合です。仮にこのケースでREADMEの変更をコミットする前にgit reset --hard
を実行すると、READMEに追記した内容が消えてしまいます。
mixed
--mixed
オプションを付けると(デフォルトなので付けなくても可)、ファイルの中身は変更されず、コミットのHEADの位置が移動し、ファイルのステージングが取り消されます。そのため、ソフトウェアの過去のバージョンを検証する目的とは合いません。git reset --mixed
を実行するのは、間違えてコミットをした場合や、コミットするつもりがない大量のファイルをコミットしてしまった場合です。このとき、以下を実行すると、ファイルの中身を変更することなく、最新コミットとそのコミットのステージングを取り消すことができます。
git reset --mixed HEAD^
なお、HEAD^
は最新のコミットの1つ前を指します。
soft
--soft
オプションを付けると、ファイルの中身は変更されず、コミットのHEADの位置だけ過去に戻ります。そのため、ソフトウェアの過去のバージョンを検証する目的とは合いません。git reset --soft
を実行するのは、間違えてコミットをした場合や、複数のファイルをコミットするつもりが一部のファイルのみコミットしてしまった場合です。このとき、以下を実行すると、ファイルの中身を変更することなく、最新のコミットを取り消すことができます。ステージングの状態は保存されます。
git reset --soft HEAD^
なお、HEAD^
は最新のコミットの1つ前を指します。