16

git stash を頻繁に使用しすぎているのかもしれませんが、プロジェクト内の実験を破棄したい場合は通常これを使用します。

質問1:

  • 現在のすべての隠し場所でファイル名を検索するにはどうすればよいですか?

質問2:

  • このファイルを別のフォルダーに抽出するにはどうすればよいですか?

  • または別のオプション: その隠しファイルのビジュアル差分ツールを起動する方法は?

4

4 に答える 4

15

もう少し重要なのは、それrefs/stashが疑似ブランチ (ref) の reflog であることを認識することです。

git rev-list --walk-reflogs stash # (long option)
git rev-list -g stash # (short option)

したがって、ファイルを見つけることができます:

for sha in $(git rev-list -g stash); 
do 
     git ls-tree -r $sha:; 
done |
   grep "$SOMEFILENAME" | 
   sort --unique

(独自の並べ替えは、異なるスタッシュ内の同じバージョンの重複を削除することです)。

例えば:

$ for sha in $(git rev-list -g stash); do git ls-tree -r $sha:; done | grep numeric.js | sort -u
100644 blob f1c9a61910ae1bbd562615444a45688b93e9d808    LSPO.Web/DaVinci/JScript/numeric.js

したがって、たとえばを使用して視覚的な差分を起動できます

kompare numeric.js <(git cat-file -p f1c9a61910ae1bbd562615444a45688b93e9d808)

もちろん、reflog に別のファイルが含まれているという予感がすでにある場合は、これははるかに簡単です。

git diff stash@{3} -- numeric.js 
于 2012-12-03T22:26:03.150 に答える
6

@sehe からの回答は、質問 2 に対する優れた回答です。

現在使用しているものよりも、質問 1 に対するより良い回答を探して、このページに来ました。私が現在使用しているのはシェル スクリプトstashshowall.shで、出力を grep します。

私の答えの違いは、ここでの他の回答は、探しているファイルが変更されたかどうかを示していますが、applyそのスタッシュを希望する場合に備えて、ファイルがどのスタッシュにあるかを示していないことです。

私の答えは純粋に「磁器」の git コマンドを使用することですが、それは私にとってはうまくいきます。

#!/bin/sh
#  stashshowall.sh
for stash in `git stash list | sed 's/\(\w*\)\:.*/\1/'`
do
    echo
    echo "$stash"
    git stash show $stash
done

質問1に答えるために、私は実行します

> stashshowall.sh | grep "stash\|some-file"

それは私に与えます

stash@{0}
stash@{1}
 .../some-dir/some-file     | 16 ++--
stash@{2}
stash@{3}
stash@{4}
 .../some-dir/some-file     | 2 ++--
stash@{5}

このようにして、私は必要があるか、またはapplyさらに調べる必要があることを知っていますstash{1}stash{4}

于 2014-06-23T21:53:28.727 に答える
2

I use this to search for a file among stashes

git stash list | cut -d ":" -f 1 | xargs -L1 git diff --stat | grep <filename>

You can create a new branch that contains the stash (git checkout -b <new_branch> <stash>) and then copy the file wherever and later merge it back.

You can use git difftool to get a visual of your diff.

EDIT: To get the commit of the stash along with the filename, you can use this shell script:

for i in $(git stash list | cut -d ":" -f 1 | xargs -L1 git show | grep commit |
  cut -d" " -f 2)
do
  if git show $i --oneline --stat | grep ht.h 
  then
    echo $i
  fi
done

It will print the commit under the filename.

于 2012-12-03T15:27:31.453 に答える