私は機能のためにかなりのコードを書き、gitの変更を隠しました。
その後、いくつかの変更をリポジトリにプッシュし、git stashを実行して、複数回適用しました(100回以上読み取ります)。
ほぼ2か月後、git stashから変更を取得したいのですが、何があっても見つけることができません。
いくつか試してみましたgit stash apply
、git stash list
、git stash list -p
。何も機能しません。私はそれらの古い隠された変更を見つけることができません。
Gitを信頼してそれらを隠しておくのではなく、バックアップを取っていたらよかったのに...ため息...
誰か助けてもらえますか?
これを試して:
git stash list -p | grep 'diff --git' | grep <your file name>
それはあなたのファイルをリストに見つけるでしょう。しばらく時間がかかる場合があります。
1つ:git stash apply
は隠し場所を破棄しません。適用が成功したら、リストが乱雑にならないようにgit stash drop
する必要があります。個人的には、git stash pop
を使用してスタッシュを適用します。
スタッシュの変更内を検索するには、git stash list
をつるはしオプション-G
(git log
から)とともに使用します。
git stash list -G regex_matching_some_added_or_removed_string
注: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を歩いているので、親のことすら気にしません。
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ファイルを検索するか、単に参照します。これは大きい場合があります。
これは私が使用するコマンドです。どのスタッシュが参照されているかを特定するのに役立ちます。
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に探しているものがあることがすぐにわかります。
上記の回答からの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.