ソースツリーを使用しています。複数の変更の隠し場所を作成し、誤ってそれを削除しました。それらを取り戻す方法はありますか?
スタッシュは、スタッシュのリストから参照されるマージコミットとして内部的に保存されます。
git fsck
はぶら下がりオブジェクトを見つけることができます。削除されたスタッシュだけでなく、おそらく他のものも見つかります...したがって、スタッシュになりそうなコミットを探したいと思うでしょう(git show <ID>
はオブジェクトに関する関連情報を表示し、それがあなたが探しているものであるかどうかを決定します)。
それができたら、あなたがする必要があるのはスタッシュのリストにそれを再挿入することだけです。リストは.git/logs/refs/stash
に保存され、行の形式は次のとおりです。
<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>
これが実際の例です:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
再挿入したい隠し場所の行を合成するだけです(名前/メール/タイムスタンプ/説明は正確ではありませんhaveではありません)。それを再び通常どおり使用できるはずです。
ハッピーハンティング!
上記の回答に基づいて、ここに簡単なシーケンスがあります:
ターミナルウィンドウを開き、リポジトリの下のフォルダーに移動します。次に:
git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
エディタでtmp2.txtを開き、紛失したコードを見つけて、commit-idその上に。次に、コードを適用します。
git stash apply <commit id>
rm tmp.txt tmp2.txt
これは私の命を救った!この質問に答えてくれたすべての人に本当に感謝しています。削除されたものをgitデータベースに保持するために、git作成者Linus Torvaldsを祝福します。天才!!
前の回答状態と同様に、git fsck
を使用して、削除されたスタッシュを含むものによって参照されないオブジェクトをリストできます。ただし、git show
を使用して、オブジェクトのリストをフィルタリングし、次のようなスタッシュのみを表示することができます。
git fsck 2> /dev/null |
awk '/commit/{print $3}' |
git show --stdin --merges --grep '^WIP on'
Stashがいつ作成されたかがわかっている場合は、--since '2 days ago'
などの引数を最終行に追加して、出力をさらに制限することもできます。リストが管理可能なサイズに縮小されることを願っています。
正しいスタッシュが見つかったら、そのコミットIDをメモし、git stash apply COMMITID
を使用して、削除されていないかのように適用できます。
JanKrügerが上記のように、git fsck
は進むべき道です。ただし、(何らかの理由で)stashファイル内の行を正常に合成できず、stashが使用可能なリストに表示されない場合は、git stash apply <guid>
直接、行を追加せずに。これにより、ファイルの変更が現在のブランチにすぐに適用されます(コミットされません)。
別の解決策は次のとおりです。
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
著者を見つけて情報をコミットします(日付、ハッシュ、著者など)
git stash store <hash-id-of-specific-commit>
以下を使用して、スタッシング中にコメントを使用すると役立つ場合があります。
git stash save "comment"
以下を使用して、既に削除されたスタッシュを見つけるのに苦労しました:
git fsck --lost-found
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
git stash apply [tag]
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less
次に、コミットID#を見つけます。
そして、やります
git stash apply {commit#}