間違えて[[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): 初コミット ```