Woman checking her email in a meeting
Gitを使っていると、作業内容をやり直したくなることはよくあります。たとえば「間違えてファイルを編集してしまった」「コミットしたけどやっぱり取り消したい」といった場面です。
そんなときに使えるのが git reset --hard
コマンドです。これは非常に強力なコマンドで、使い方を誤ると取り返しのつかないデータの損失につながる可能性があります。
この記事では、git reset --hard
の基本的な使い方から、実際の使用例、そして注意すべきポイントまで、わかりやすく解説します。これからGitをもっと使いこなしたい方や、失敗せずに安全にリセット操作を行いたい方は、ぜひ参考にしてください。
git reset --hard
は、Gitの履歴や作業ディレクトリを指定したコミットの状態に完全に戻すコマンドです。
簡単に言うと、「変更したけど保存していない編集」や「コミットした変更」までなかったことにできるというものです。
構文はとてもシンプルです。
git reset --hard <コミットID>
<コミットID>
を省略すると、HEAD(現在の最新コミット)に対して変更を取り消します。
以下のような状況で役に立ちます。
例として、以下のようなシーンが考えられます。
git reset --hard HEAD
これは、「今のコミット時点に、作業ツリーとインデックスを完全に戻す」ことを意味します。
つまり、未保存の変更も、ステージング済みのファイルもすべて取り消されるので、注意が必要です。
git reset --hard HEAD
これで現在のコミット(HEAD)と同じ状態に戻ります。
作業ツリーもインデックスもリセットされるため、すべての変更が削除されます。
git reset --hard 8f4a1b2
特定の過去のコミットIDを指定することで、その時点の状態に完全に戻せます。
この操作により、それ以降のコミットは履歴から削除され、元には戻せません。
git reset --hard
を使うと、作業ツリーの変更(保存していない編集など)も消えます。
これは、VSCodeなどのエディタで保存していない変更も含め、完全に消去される可能性があるため、慎重に使う必要があります。
--hard
で過去のコミットに戻した場合、それ以降の履歴がローカルから削除されます。
一度削除したコミットは通常の方法では復元できません。
万が一に備え、以下のようにブランチを切ってから作業すると安全です。
git branch backup-branch
これで、誤って変更を消してしまっても、バックアップブランチから復元できます。
コマンドを打つ前に、以下のように現在の状態を確認しておきましょう。
git status
これにより、今ステージングされているファイルや、変更されたファイルがわかります。git reset --hard
は、ここで表示されている変更をすべて破棄してしまうため、必ず確認しましょう。
「やっぱり戻したい!」と思ったとき、実は git reflog
を使えば過去のコミットに戻れることがあります。
git reflog
これで、過去のHEADの移動履歴が表示されます。たとえば以下のような表示が出たとします。
8f4a1b2 HEAD@{0}: reset: moving to 8f4a1b2
3c6f9d3 HEAD@{1}: commit: バグ修正
このように、消してしまったコミットのIDがわかれば、以下のように復元できます。
git reset --hard 3c6f9d3
ただし、reflog
の履歴も時間が経つと消えることがあるため、早めの対処が必要です。
コマンド | 内容 |
---|---|
git reset --soft | コミットを取り消すが、変更はそのままステージング状態になる |
git reset --mixed (デフォルト) | コミットとインデックスを取り消し、作業ツリーはそのまま |
git reset --hard | すべての変更を破棄。インデックスも作業ツリーもリセットされる |
つまり、--soft
は安全、--mixed
は中間、--hard
は最も強力で危険な操作です。
git reset --hard
は、非常に便利で強力なコマンドですが、使い方を間違えると取り返しがつきません。
重要なポイントは以下の通りです。
git status
で確認するgit reflog
を使って復元できる場合もある変更を完全にやり直したいときには頼れる存在ですが、慎重な判断が求められます。
まずはローカルの安全な環境で試しながら、少しずつ慣れていきましょう。