1921

私はいつも、 を実行することで隠し場所に名前を付けることgit stash save stashnameができ、後で を実行することで適用できるという印象を受けていgit stash apply stashnameました。しかし、この場合、それがstashnameスタッシュの説明として使用されるだけのようです。

実際に隠し場所に名前を付ける方法はありませんか? そうでない場合、同等の機能を実現するために何をお勧めしますか? 基本的に、私は定期的に適用したい小さなスタッシュを持っていますがgit stash list、実際のスタッシュ番号が何であるかを常に探す必要はありません。

4

27 に答える 27

1503

これはあなたがそれを行う方法です:

git stash push -m "my_stash"

"my_stash"スタッシュ名はどこにありますか。

知っておくと便利なこと: すべての stash はスタックに格納されます。タイプ:

git stash list

これにより、すべての隠し場所が一覧表示されます。

stash を適用して stash スタックから削除するには、次のように入力します。

git stash pop stash@{n}

stash を適用して stash スタックに保持するには、次のように入力します。

git stash apply stash@{n}

n隠し変更のインデックスはどこにありますか。

stash 名を使用して、stash を適用してスタックに保持できることに注意してください。

git stash apply my_stash_name
于 2013-03-04T08:18:13.163 に答える
131

十分に重要であると思われる場合は、スタッシュをブランチに変えることができます。

git stash branch <branchname> [<stash>]

マニュアルページから:

<branchname>これにより、 が最初に作成されたコミットから始まる名前の新しいブランチが作成およびチェックアウトさ<stash>れ、記録された変更が<stash>新しい作業ツリーとインデックスに適用され、<stash>正常に完了した場合は が削除されます。no<stash>を指定すると、最新のものを適用します。

これは、実行したブランチがgit stash save十分に変更され、競合のために git stash apply が失敗する場合に役立ちます。git stash が実行された時点で HEAD であったコミットの上に stash が適用されるため、競合することなく、最初に stash された状態が復元されます。

後で、この新しいブランチを、隠していた場所の子孫である別の場所にリベースできます。

于 2012-06-29T22:34:19.220 に答える
59

隠し場所は、あなたが望むような永続的なものではありません。コミットでタグを使用する方がよいでしょう。隠したいものを構築します。それをコミットしてください。そのコミットのタグを作成します。次に、ブランチを にロールバックしますHEAD^git cherry-pick -n tagnameそのスタッシュを再適用する場合は、 ( -nis )を使用できます--no-commit

于 2012-06-29T21:39:34.260 に答える
53

を使用git stash push -m aNameForYourStashして保存します。次に、適用するstashgit stash listのインデックスを学習するために使用します。次に、スタッシュをポップして適用するために使用します。git stash pop --index 0

注:gitバージョン2.21.0.windows.1を使用しています

于 2019-09-05T13:40:46.643 に答える
8

エイリアス

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

使用法

git sapply "<regex>"

  • Git for Windows との互換性

編集: 私は元の解決策に固執しましたが、大多数が Etan Reisner のバージョン (上記) を好む理由がわかります。記録のために:

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"
于 2013-11-26T22:51:49.507 に答える
6

この答えは、クレメン・スラヴィチのおかげです。受け入れられた回答についてコメントしたところですが、まだ十分な担当者がいません:(

git エイリアスを追加して stash ref を見つけ、それを show、apply、drop などの他のエイリアスで使用することもできます。

[alias]
    sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
    sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
    sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
    sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"

パターンの理由は、ref=$( ... ); echo ${ref:-<no_match>};sshow、sapply、および sdrop が期待どおりに失敗するのではなく、最新の stash をターゲットにする空白文字列が返されないようにするためであることに注意してください。

于 2018-01-11T01:30:02.457 に答える
0

隠し場所の作成以外のすべてについて、依存関係としてfzfを導入することによる別の解決策を提案します。5 分間の時間を割いて導入することをお勧めします。これは全体的に優れた生産性ブースターであるためです。

とにかく、隠し検索を提供するサンプルページからの関連する抜粋。スクリプトレットを変更して機能を追加するのは非常に簡単です (stash アプリケーションやドロップなど)。

fstash() {
    local out q k sha
    while out=$(
            git stash list --pretty="%C(yellow)%h %>(14)%Cgreen%cr %C(blue)%gs" |
            fzf --ansi --no-sort --query="$q" --print-query \
                --expect=ctrl-d,ctrl-b); do
        mapfile -t out <<< "$out"
        q="${out[0]}"
        k="${out[1]}"
        sha="${out[-1]}"
        sha="${sha%% *}"
        [[ -z "$sha" ]] && continue
        if [[ "$k" == 'ctrl-d' ]]; then
            git diff $sha
        elif [[ "$k" == 'ctrl-b' ]]; then
            git stash branch "stash-$sha" $sha
            break;
        else
            git stash show -p $sha
        fi
    done
}
于 2016-09-10T11:58:54.417 に答える