git resetコマンド - コミットの位置を移動する

git resetコマンドは、現在のブランチのコミットの位置を移動するコマンドです。

git reset コミットID

git resetコマンドは、使い方によっては、現在のワーキングディレクトリの変更内容をなかったことにしてしまうので、この点について、先に書いておきます。

--hardオプションは、ワーキングディレクトリの変更すべて元に戻す

git resetコマンドの「--hard」オプションは、ワーキングディレクトリに行われている変更をすべて元に戻します。

# ワーキングディレクトリに行われている変更をすべて元に戻し
# コミット位置を変更
git reset --hard コミットID

ですので、git resetコマンドを使う場合は、コミットの位置だけを移動したいのか、ワーキングディレクトリに加えた変更を戻したいのかということを、まずよく考えてください。

ワーキングディレクトリに加えた変更をすべて元に戻したい

ソースコードを変更していて、ワーキングディレクトリに加えた変更を元に戻したという場合は「--hard」オプションを指定します。コミットIDが省略された場合は、最新のコミット位置に戻ります。

# ワーキングディレクトリに加えた変更をすべて元に戻したい
git reset --hard

ワーキングディレクトリに加えた変更を維持して前のコミットに戻したい

間違ってコミットしてしまった場合、ワーキングディレクトリに加えた変更を維持して、前のコミットに戻したいという場合があります。そのような場合は「--hard」オプションを指定せずに、一つ前のコミットIDを指定します。

# ワーキングディレクトリに加えた変更を維持して前のコミットに戻したい
git reset ひとつ前のコミットID

過去のある状態を復元したい

過去に削除した実装をもう一度参考にしたいなど、過去のある状態に戻したいという場合があります。このような場合は、git branchコマンドで、過去用のブランチを作成してから、「git reset --hard」で過去の状態に戻すのが安全です。

# oldブランチを作成
git branch old

# oldブランチに切り替え
git checkout old

# 現在のブランチがoldであることを確認
git branch

# 以下のように出力されることを確認
  main
* old

# 過去の状態に戻る
git reset --hard 過去のある時点のコミットID

戻りたい地点を探すには、コミットメッセージを検索できる、git logコマンドの「--grep」オプションが便利です。

git log --grep 'fix foo'

コミットIDが見つかった、その状態に戻したければ、そのコミットIDを使いましょう。また、その一つ前に戻りたいという場合もあると思います。その場合は、一つ前のコミットを表現する「^」を使えます。

# 見つかったコミットIDに戻す
git reset --hard コミットID

# 見つかったコミットIDの直前に戻す
git reset --hard コミットID^

関連情報