web-dev-qa-db-ja.com

いくつかのコードを隠しましたが、それがどの隠し場所にあるのかわかりません-どうやって理解するのですか?

私は機能のためにかなりのコードを書き、gitの変更を隠しました。

その後、いくつかの変更をリポジトリにプッシュし、git stashを実行して、複数回適用しました(100回以上読み取ります)。

ほぼ2か月後、git stashから変更を取得したいのですが、何があっても見つけることができません。

いくつか試してみましたgit stash applygit stash listgit stash list -p。何も機能しません。私はそれらの古い隠された変更を見つけることができません。

Gitを信頼してそれらを隠しておくのではなく、バックアップを取っていたらよかったのに...ため息...

誰か助けてもらえますか?

20
user811433

これを試して:

git stash list -p | grep 'diff --git' | grep <your file name>

それはあなたのファイルをリストに見つけるでしょう。しばらく時間がかかる場合があります。

1つ:git stash applyは隠し場所を破棄しません。適用が成功したら、リストが乱雑にならないようにgit stash dropする必要があります。個人的には、git stash popを使用してスタッシュを適用します。

16
Alex Siri

スタッシュの変更内を検索するには、git stash listをつるはしオプション-Ggit logから)とともに使用します。

git stash list -G regex_matching_some_added_or_removed_string
11
Dag Høidahl

注:stashed merged commitの場合、git stash list -pは何も返しません。
これはGit2.2(2014年第4四半期)で変更され、 commit 288c67c by Jeff King(peff

stash:デフォルトのリストはworking-treediffになります

スタッシュを一覧表示する場合、任意のgit logオプションを指定して表示を変更できます。ただし、-p」だけを追加しても何も起こりません。これは、各スタッシュが実際にはマージコミットであるためです。

この実装の詳細は忘れがちで、「-p」が機能していないと考えるユーザーを混乱させます。デフォルトで「--first-parent -m」に設定すると、これを簡単に行うことができます。これにより、作業ツリーとの差分が表示されます。
これにより、スタッシュのインデックス部分が完全に省略されますが、シンプルで、「git stash show」が提供するものと一致します。

Stashの本当の形についてより手がかりがある人は、「--cc」を使用して「-m」をオーバーライドでき、「--first-parent」は何もしません。
diffの場合、結合されていないdiffにのみ影響するため、「--cc」がオーバーライドされます。
そして、トラバーサルについては、とにかく線形reflogを歩いているので、親のことすら気にしません。

5
VonC

git stash listにリストされているスタッシュが数個しかない場合は、それらを1つずつ調べて、正しいものかどうかを確認できます。

git show 'stash@{0}'
git show 'stash@{1}'

等.

many stashesにコードがあり、そのコードを(ほぼ)一意に識別するファイルに入力した文字列またはキーワードを覚えている場合(ここではDUNKIRKを使用)、検索します。次のbashコマンドを使用します。

for i in `git reflog --pretty=format:%H stash`; do git grep DUNKIRK $i; done

git grepは、変更だけでなく、チェックアウト全体を検索することに注意してください。

隠し場所で変更されたファイル名を検索する@siriからの回答を比較してください。これは、もう1つの便利な戦略です。

または、差分のみを検索するには

 git reflog -p stash | less

次に、文字列ORファイルを検索するか、単に参照します。これは大きい場合があります。

4
Alex Brown

これは私が使用するコマンドです。どのスタッシュが参照されているかを特定するのに役立ちます。

git stash list | while IFS=: read STASH ETC; do echo "$STASH: $ETC"; git diff --stat $STASH~..$STASH --; done | grep -e 'stash\|<partial_name_of_file_being_searched_for>'

また、次のように.bashrcファイルのエイリアスと組み合わせて使用​​します。

function gitsearch()
{
   searchCrit='stash\|'$1
   git stash list | while IFS=: read STASH ETC; do echo "$STASH: $ETC"; git diff --stat $STASH~..$STASH --; done | grep -e $searchCrit
}
alias githunt=gitsearch

最終結果は、次のようにgitstashを検索できることです。

githunt LoanApplicationFee

次の結果が得られ、スタッシュ45に探しているものがあることがすぐにわかります。

enter image description here

4
Uncle Iroh

上記の回答からのgitコマンドの組み合わせは、私が必要なものを手伝ってくれました。他の人に役立つ可能性があり、単一の回答/コメントを受け入れることができないため、ここに私の回答を投稿します

git stash list -p - showed me the list of stashes

git stash pop 'stash@{12}' - popped out the 12th stash which contains my code.
1
user811433