web-dev-qa-db-ja.com

SourceTreeを使用してGitで削除されたスタッシュを取得する

ソースツリーを使用しています。複数の変更の隠し場所を作成し、誤ってそれを削除しました。それらを取り戻す方法はありますか?

49
tusharmath

スタッシュは、スタッシュのリストから参照されるマージコミットとして内部的に保存されます。

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ではありません)。それを再び通常どおり使用できるはずです。

ハッピーハンティング!

47
Jan Krüger

上記の回答に基づいて、ここに簡単なシーケンスがあります:

ターミナルウィンドウを開き、リポジトリの下のフォルダーに移動します。次に:

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を祝福します。天才!!

70
ishahak

前の回答状態と同様に、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を使用して、削除されていないかのように適用できます。

21
qqx

JanKrügerが上記のように、git fsckは進むべき道です。ただし、(何らかの理由で)stashファイル内の行を正常に合成できず、stashが使用可能なリストに表示されない場合は、git stash apply <guid>直接、行を追加せずに。これにより、ファイルの変更が現在のブランチにすぐに適用されます(コミットされません)。

9
Roddy T.

別の解決策は次のとおりです。

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log

著者を見つけて情報をコミットします(日付、ハッシュ、著者など)

git stash store <hash-id-of-specific-commit>
4
hcknl

これは、削除されたstashを回復する最もクリーンな回避策です。

  1. git fsck --lost-found

  2. ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline

  3. git stash apply [tag]

enter image description here

[タグ]をIDに置き換えます(例:

git stash apply 40e47250d0b4fb6143be67c115b708be126e79d3

4

以下を使用して、スタッシング中にコメントを使用すると役立つ場合があります。

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]
2
Rados
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#}
1
Ankur Jain