【Git】誤ってresetしたコミットを戻す方法

Git

誤ってresetしたコミットをgit reflog を使用して戻す方法

git reset などで削除したコミットを戻す

誤ってgit reset などでコミットを削除してしまったときや、特定のコミットの状態に戻したいときに git reflog で過去の操作履歴を参照してから、reset で戻します。(すでにプッシュ済みで reset を行った場合は git pull でリモートのコミットまで戻せます。)

git reflog は、リポジトリ内での過去の操作履歴(リファレンスログ)を表示します。これにはコミット、ブランチの切り替え、リベースなど、リポジトリ内で実行されたすべての操作が含まれます。

$ git reflog
5b1c155 (HEAD -> develop) HEAD@{0}: reset: moving to @^
734a3f9 HEAD@{1}: reset: moving to @^
db172e6 HEAD@{2}: commit: .gitignore に.DS_Storeの追加
734a3f9 HEAD@{3}: commit: MySQLからtodoリストを取得して表示する機能の追加

$ git reset --hard HEAD@{戻したいコミットの数字}

注意点としては、Untracked files(未追跡ファイル)を git add でステージングエリアに移動させた後に git reset を行うと削除されるので reset を行う際には新規のファイルをaddしてはいけません。

未追跡ファイルを git add した後に git reset –hard で削除してしまった場合

状況としては、git commit した後にファイルがコミットから漏れていた場合に git commit –amend でコミットに漏れたファイルを追加するために未追跡ファイルを git add してから git reset –hard してしまった場合です。

この場合は git fsck –lost-found で参照できない削除されたファイルを探すことになります。以下は参照元からの引用です。

この操作を行うと .git/lost-found/other ディレクトリに 「どのような参照(ブランチ、タグ等)からもたどり着けないblob(一般ファイル)オブジェクト」 が、 Git のオブジェクトデータベースから取り出されて格納されます。 add した時点で Git のオブジェクトデータベースには格納されているので、「add だけして commit していないファイル」はこれに含まれます。

git add しただけのファイルを git reset –hardで消してしまったときの対処法

git fsck –lost-found コマンドを使用すると、以下のような形で参照できない commit と blob が表示されるのでblobを復活させると良さそうです。(この場合は blob が1つしかないので特定が簡単です)

git fsck –lost-found

$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling commit 1dc6e9723c25f7ace9f7b5287aad1abd6443d91f
dangling blob 2ba6c7a52a1ccd4938788189c9e855a18217b18f
dangling commit 0949c14196b147925a411303681c38049a46206c
dangling commit 8535ba273b28a9aea3c490b68a7edc00dae25b66
dangling commit 99857a419440d0035e2b1001d2b62ad87ecb068f

.git/lost-found/other ディレクトリにこれらの情報が格納されるので直接ディレクトリから確認することもできます。

.git
├── lost-found
│   ├── commit
│   │   ├── 0949c14196b147925a411303681c38049a46206c
│   │   ├── 1dc6e9723c25f7ace9f7b5287aad1abd6443d91f
│   │   ├── 8535ba273b28a9aea3c490b68a7edc00dae25b66
│   │   └── 99857a419440d0035e2b1001d2b62ad87ecb068f
│   └── other
│       └── 2ba6c7a52a1ccd4938788189c9e855a18217b18f

ファイルと復活させるには git unpack-file コマンドを使用します。git の仕組み上、ファイル名はblobの中に格納されないので取り出すことはできません。なので、復活させたファイルは中身を確認した後にファイル名を変更する必要があります。

# Creates a temporary file with a blob’s contents
$ git unpack-file 2ba6c7a52a1ccd4938788189c9e855a18217b18f
.merge_file_9inyVu

参照: git add しただけのファイルを git reset –hardで消してしまったときの対処法

タイトルとURLをコピーしました