JavaScriptを有効にしてください

Gitで過去のコミットに一時的に戻る

 ·   6 min read

はじめに

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つ前を指します。

参考文献

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です

サイト内検索