Posted at

git で間違ってリビジョンを消してしまった時にできること

More than 1 year has passed since last update.


はじめに

つい先日、masterブランチを開発ブランチにマージした際にやらかしてしまい。

開発ブランチ上のコミットが消えて(見えなくなって)、かなり焦ることがありました。

その際、.git配下のファイルから復帰が出来たので、その時のメモになります。


やらかしたこと


なにをしていたか


  • 開発ブランチで開発中だった

  • hotfix 対応があった

  • hotfix 対応部分を開発ブランチに取込もうと、マージした

  • 冗長なコミットに気付く

  • ログを綺麗にしようと思いたち、リビジョンを戻した
    shell-session
    git reset --hard <revision>


  • 冗長なコミットをまとめて修正

  • まとめて push
    shell-session
    git push -f origin <開発ブランチ>


正確に把握していない(ボーっと作業していた)ので、

なにか間違いがありそうですが、たぶんこんな感じです。


・・・ここ3日で作ったコミットが、ない!?

リモートリポジトリを眺めていて異変に気付きました。

「あれ?ブランチ間で差分が出てない。」

「開発ブランチにしかないコミットがあるはずなのに?」

「・・・ここ3日で作ったコミットが、ない!?」

久しぶりに心臓が冷える思いがしました。。

GWに出勤して作ったのに・・。


何をして復旧したか?


git を信じて revision ログを探す

心臓は冷えましたが、「git なら残っているはず」と信じて、

.git 以下のファイルを見てみました。

以下、ほぼ名前からの推測と勘で、目的のファイルに一発で

辿り着きました。

直感的な名付けとフォルダ分けがされていて本当~~~~に助かりました。

さすが git様。

ありがとう、いいツールです。

以下、見て行った順に画像を貼ります。


.git

01.dotgit.png

ここは、フォルダ名を信じて logs を見ます。


.git/logs

02.logs.png

HEADではないので、refs を見てみます。


.git/logs/refs

03.refs.png

remoteではないので、heads を見てみます。


.git/logs/refs/heads

04.heads.png

featureフォルダが見えました。かなり期待が持てますね。。どきどき

※ ちなみに、feautreってなんでしょうね。


.git/logs/refs/heads/feature

画像は割愛していますが、ありました。feature 毎のファイルが。

さっそく、やらかしたfeatureと同名のファイルを見てみます・・!


repository

repository.png

きました・・。

コミット時のリビジョンが残っています・・・。

これで、git reset すれば・・!どきどき

git reset --hard <revision>


復旧しました!

私の場合は、この作業でやらかす前に戻ることができました!

(3日分の作業が無駄にならずに済みました・・!)


教訓

フォルダ分け、名付けは本当に大事。

こんなミスを他の人が犯すのかは疑問ですが(苦笑)

どなたかの参考になれば幸いです。