読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【Git】stashの履歴は残っている。

dev-tips tool

Gitのstashというコマンド、すごい便利ですよね!
まだコミットしていない変更分をちょっと別の場所に避けておいて、
他のブランチに切り替えたり、別の変更を加えたり、他のブランチに変更を反映したり。
お世話になっています。


で、stash(で避けておいた内容)はpopしたりclearしたりすることで消えてしまうのですが、
実は内部には履歴が残っているそうです。

こないだそのおかげで命拾いしました…。


ある日、しばらくcommitしていなかった(これがそもそもダメなのですが)branchで作業中、
誤ってRAILS_ROOT以下のファイルをほとんどすべて消しさってしまったのです\(^o^)/

血の気が引きました…
どうにかして復活できないかと方法を調べていたところ、
下記の情報を見つけることができました。


〜ほんとにほんとに感謝です!!〜
git stash clearを元に戻す方法 — Gist


どうやらstashの履歴はGitの中に残っており、それを復活(marge)させることができるよう。

運の良いことに、Railsプロジェクトを吹き飛ばすすこし前に
stashを使って作業していたのです。
上記ページの解説の通り進めると、履歴を発見しその時の作業分をマージさせることができました!!

〜復活手順〜
①行目:候補のsha1(commit id)がいくつか出てきます(stashだけじゃないのかも?)
②行目:それらのsha1の内容を確認していき、復活させたい変更を見つけ出します(多いと大変…)
③行目:取り込みたい変更が見つかったら、cherry-pickでブランチに反映させます

$ git fsck | awk '/dangling commit/ {print $3}'
$ git show --summary 候補のsha1
$ git cherry-pick -n -m1 取り込みたい履歴のsha1


これで大部分が復旧できたので本当に助かりました!!
こまめにコミットすることがいかに大事かを痛感した出来事でした(*_*)


stashに限らず、Gitは作業の履歴が見えなくなっても残っていることが多いそうなので、
私みたいに間違ってぶっ壊してしまった場合などでも、復旧に使える履歴がないかまず探してみるべきですね。