間違えて[[Hard reset (Git)|Hard reset]]してしまったときに、消えてしまったコミットの内容を取り戻す方法。[[reflog (Git)|reflog]]と[[Hard reset (Git)|Hard reset]]を使う。
> [!info]
> コミットはしていないが[[ステージング (Git)|ステージング]]していた変更の場合は [[Hard resetで消えたステージングした変更を取り戻す (Git)|Hard resetで消えたステージングした変更を取り戻す]] を参照。
## 前提条件の作成
コミットを4回した状況を考える。
```mermaid
gitGraph:
commit id: "初コミット"
commit id: "コミット2"
commit id: "コミット3"
commit id: "コミット4" type: HIGHLIGHT
```
[[reflog (Git)|reflog]]はこう。
```console
$ git reflog
bf2678a (HEAD -> master) HEAD@{0}: commit: コミット4
a94fffb HEAD@{1}: commit: コミット3
0193ae3 HEAD@{2}: commit: コミット2
441814c HEAD@{3}: commit (initial): 初コミット
```
間違えて `コミット2` の状態に [[Hard reset (Git)|Hard reset]] してしまったとする。
```console
git reset --hard HEAD~2
```
[[コミットグラフ]]はこの状態に戻る。
```mermaid
gitGraph:
commit id: "初コミット"
commit id: "コミット2" type: HIGHLIGHT
```
[[reflog (Git)|reflog]]はこんな感じ。
```console
$ git reflog
0193ae3 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2
bf2678a HEAD@{1}: commit: コミット4
a94fffb HEAD@{2}: commit: コミット3
0193ae3 (HEAD -> master) HEAD@{3}: commit: コミット2
441814c HEAD@{4}: commit (initial): 初コミット
```
## 復活の仕方
今の[[コミットグラフ]]はこうなっている...
```mermaid
gitGraph:
commit id: "初コミット"
commit id: "コミット2" type: HIGHLIGHT
```
が、実際には `コミット3` と `コミット4` も `.git` 配下にはまだ存在する。なので、[[HEAD (Git)|HEAD]]の向き先を `コミット4` のハッシュに向ければ良い。
```console
git reset --hard HEAD@{1}
```
[[コミットグラフ]]が元に戻った。
```mermaid
gitGraph:
commit id: "初コミット"
commit id: "コミット2"
commit id: "コミット3"
commit id: "コミット4" type: HIGHLIGHT
```
[[reflog (Git)|reflog]]にも結果が残る。
```console
$ git reflog
bf2678a (HEAD -> master) HEAD@{0}: reset: moving to HEAD@{1}
0193ae3 HEAD@{1}: reset: moving to HEAD~2
bf2678a (HEAD -> master) HEAD@{2}: commit: コミット4
a94fffb HEAD@{3}: commit: コミット3
0193ae3 HEAD@{4}: commit: コミット2
441814c HEAD@{5}: commit (initial): 初コミット
```