2017-05-23 20 views
5

は、複数のスタッシュを行うことができます。Git stashを並べ替える方法はありますか? Gitの一

git stash pop [email protected]{3} # recover quick temp stash 
git stash pop [email protected]{2} # recover another quick temp stash 

しかし、明らかに、より便利な構文であることが好ましい::

git stash save "quick temp stash" 
git stash save "another quick temp stash" 
git stash save "This is important but I need to put it on the back burner" 
git stash save "This is almost certainly garbage, but just in case ..." 

は今、私は私が戻って任意の順序でそれらのスタッシュを得ることができることを知っている

git stash pop 

これは、入力する必要がないだけでなく、思考が少なくて済むためでもありません。私はいくつかのひだがある場合、私は見なければなりませんそれらを抱えて、おそらくgit stash showカップル、私が望むものを見つけるまで。しかし、私がちょうど一番上に(最近の一時休憩などの後に)最新の「temp」隠しを残しておけば、私はまったく考える必要はありません。私はただpopです。

私の質問は、私は自分の隠し書きを並べ替えることができるので、私がそれらを保存する時に、私が "ポップ" "それら。これで私はまだ「これはほぼ確実にごみですが、ちょうどその場合...」と「これは重要ですが後ろのバーナーに置く必要があります」という節約を可能にしますが、隠しリストの裏にはシンプルなクイック・スタッシュへのアクセスを複雑にしません。

+0

P.S.私は、一度に1つの隠しポットを1つずつ破棄し、それぞれをコミットしてから、それらのコミットを希望の順序で再分配し、それぞれをリセット(ソフト)し、隠しに戻すことができることを知っています。しかし、それは本当に扱いにくいだけでなく、別の枝からのはしけでも機能しない可能性もあるので、他の方法もあると思っています。 – machineghost

答えて

2

Whymarrh's answerDonnie's commentのように、私はあなたがたぶんコミットする方が良いと思います。それは、git stash popを使用せずにこれを実行することが可能です

...

あなたが本当にスタッシュを使用し続けると、それらの順序を変更したい場合は、作業中に、あなたはrefs/stashを調整することができます:私は、しかし、それを注意しますまったく。それは単なるトリッキーです。 (編集:私は再読み込み、これはWhymarrhの答えに考えだったことを参照してください)

REFLOGファイル、.git/logs/refs/stash、Nを通じて1(ただし、多くが存在する)REFLOGエントリを保持しています。 stash参照自体はエントリ0を保持します。

drop動作(git reflog deleteは特別ゼロケースを扱う方法を知っている)特定REFLOGエントリを除去することからなる:

drop_stash() { 
     assert_stash_ref "[email protected]" 

     git reflog delete --updateref --rewrite "${REV}" && 
       say "$(eval_gettext "Dropped \${REV} (\$s)")" || 
       die "$(eval_gettext "\${REV}: Could not drop stash entry")" 

     # clear_stash if we just dropped the last stash entry 
     git rev-parse --verify --quiet "[email protected]{0}" >/dev/null || 
     clear_stash 
} 

clear_stashrefs/stash自体を削除します)。 $REV引数は、特定のものを指定しなかった場合はrefs/[email protected]{N}、またはrefs/stashです。

store操作がgit update-refを使用して、ゼロのエントリを挿入します。

[snip] 
     w_commit="$1" 
     if test -z "$stash_msg" 
     then 
       stash_msg="Created via \"git stash store\"." 
     fi 

     git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit 
     ret=$? 
     test $ret != 0 && test -z "$quiet" && 
     die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")" 
     return $ret 

それは(あなたがフォースまたはPostScriptに精通している場合)ビットトリッキーいえ、「ロール」動作を実現する、ことが可能です。

E [email protected]{4} 
D [email protected]{3} 
C [email protected]{2} 
B [email protected]{1} 
A [email protected]{0} 

へ:

E [email protected]{4} 
D [email protected]{3} 
B [email protected]{2} 
A [email protected]{1} 
C [email protected]{0} 

あなただけの、下へCコピーする新しいstoreを経由しているかのように、その後、[email protected]{3}を落とし変更、例えば、1段階まで下の3つのエントリをロールバックします(これはゼロの挿入のために上に移動した)。

実際にはgit stash -q storegit stash -q dropを適切な引数を付けて実行することでこれを行うことができます。

+0

それを再読み込みし、適切なスクリプト(うまくいけば素敵なシンプルなもの)を書くには時間がかかるでしょうが、それはまさに私が探していたもののようです。ありがとう! – machineghost

3

箱なし - 私は隠しが実際にそのワークフローのために意図されたとは思わない。

つまり、一時的なコミットに切り替えると、正しくコミットされ、cherry-pickがコミットすることができます(例えばgit stash popの代わりにgit cherry-pick $tempbranch)。

スタッシュをそのまま使用して並べ替えたい場合は、作業中にrefs/stashを調整することができます(スクリプトを使用して)。 git-stash documentation

作成した最新の隠しは、refs/stashに格納されています。このリファレンスのreflogに古いスラッシュがあり、通常のreflog構文を使用して名前を付けることができます(例えば[email protected]{0}が最後に作成されたstashで、[email protected]{1}が前のものです)。[email protected]{2.hours.ago}も可能です。また、隠しインデックスのみを指定することで、ひな形を参照することもできます(たとえば、n[email protected]{n}に相当)。

あなたはまた、あなたの処分でgit stash creategit stash storeを持つワークフローのためのスクリプトを記述することを決定した場合:

を作成スタッシュを作成します(通常のコミットオブジェクトです) ref名前空間のどこにもオブジェクト名を格納せずにオブジェクト名を返します。これは、スクリプトにとって便利なものです。おそらくあなたが使用したいコマンドではありません。上記の「保存」を参照してください。

ストアストアgitの隠し場所を経て作成された特定のスタッシュはスタッシュのREFLOGを更新スタッシュrefの内、(コミットダングリングマージがある)を作成します。これは、スクリプトにとって便利なものです。おそらくあなたが使用したいコマンドではありません。上記の「保存」を参照してください。

+0

'create' /' store'はおもしろいですが、 'store'はstashのインデックスを設定することはできませんので、' save'と同じように良い/悪いと思われます。 ? – machineghost

+0

スクリプトのオプションとして 'create' /' store'を提供していました。コマンドラインであまり使われません。私は少し明確にする答えを編集しました。 – Whymarrh

+0

私はあなたがスクリプトのためにそれらを意図したことを理解しました、そして、私はスクリプトを書いてうれしいですが、私が理解していないものは、(スクリプトの中から呼び出されたとしても)スクリプトでさえも同じ究極の制約があるようです。つまり、それらのいずれかを「後ろに」移動するために隠れたものをすべてポップする必要があります。そのため便利な方法はありません。それがなくても)スクリプトがstashを並べ替えることは不可能に思えます。 – machineghost

関連する問題