Skip to content

Instantly share code, notes, and snippets.

@sudodo
Created December 9, 2011 06:24
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sudodo/1450466 to your computer and use it in GitHub Desktop.
Save sudodo/1450466 to your computer and use it in GitHub Desktop.
git stash clearを元に戻す方法
h1. 変更が消えてしまった!?その対応
せっかく実施したコードへの修正が消えてしまう、これほど開発者をがっかりさせることは無いでしょう。
Gitを使えば、消えてしまったように見える変更を復活できることがあります。
h2. 大原則
復活できる可能性があるのは、「何らかの形でGitに履歴を残してある歴史」だけです。
たとえば、以下のファイルを復活させることはできません。
<pre>
$ touch foo.txt
$ vim foo.txt
$ rm foo.txt
この時点で、foo.txtの復活は不可能
</pre>
逆に言えば、Gitに変更の痕跡があれば、復活の可能性は大いにあります。
例.1-1
<pre>
$ touch foo.txt
$ vim foo.txt
$ git add .
$ git commit -m "add foo.txt"
$ git reset --hard HEAD~10
foo.txtは復活可能
</pre>
この記事で、変更履歴の復活の仕方を共有していきましょう。
h2. reflogで参照可能な変更
上記の例.1-1であれば、reflogコマンドですぐに復活が可能です。
<pre>
$ git reflog
$ git reset --hard HEAD@{xxx}
(xxxの番号はreflogコマンドで確認する)
</pre>
h2. stash clearしてしまった履歴
stashコマンドは非常に便利で、多用するデベロッパーが多い一方、危険も隣り合わせです。
一瞬で、あなたの変更履歴をどこかに消し去ってしまいます。
<pre>
$ vim ... # => たくさんの変更
$ git stash
git stash pop をするつもりが、git clearしてしまった!!!
$ git clear # => 変更が闇のかなたに・・・
</pre>
このようなときには、git fsckコマンドを使って消してしまったstashを復活させることができます。(ただし、多少の時間がかかることを覚悟してください。でも復活できないよりはましでしょう)
<pre>
$ git fsck | awk '/dangling commit/ {print $3}'
候補の sha1 がいくつか出てくる
$ git show --summary 候補のsha1
一つ一つの sha1 の内容を確認
$ git cherry-pick -n -m1 見つけたsha1
</pre>
この例では、git show --summaryを繰り返し打鍵することになります。くじけそうになりますが、どこかに消えてしまった宝物があると思って粘り強く探しましょう。
最後の、"git cherry-pick -n -m1 <sha1>"で、クリアしてしまったstashがステージングされた状態になります(cherry-pickの-nオプション)。もし、完全に最初の状態にしたければ、git reset HEAD コマンドを使えばいいでしょう。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment