1. ホーム
  2. git

[解決済み] git stash はブランチ専用ですか、それともリポジトリ全体ですか?

2022-09-08 01:56:48

質問

あるブランチに入り、作業を行いました。 別のブランチに入りたかったのですが、コミットしたくなかったので、次のようにしました。 git stash . それから git checkout <otherbranch> . そこでいくつかの作業をしましたが、最初のブランチと同じように、作業をコミットする前に切り替えたかったのです。 そこで私は git stash を実行しました。 最初のブランチに戻って、それをアンスタッシュしようとしました ( git stash pop を実行してみました。 私は、その特定のブランチから隠し場所を取得すると思っていました。 <otherbranch> (最新のstash)からstashを解いたことに驚きました。 私は、stashはブランチ固有であるという印象を持っていましたが、この動作は、ローカルリポジトリ全体に対して1つのstashしかないことを表しています。

git stash はブランチ専用ですか、それともリポジトリ全体ですか? リポジトリ全体に適用されるのであれば、オプションを渡してブランチ専用にすることはできますか?

どのように解決するのですか?

現在のスタッシュを見るには。

git stash list

スタックから特定の隠し場所を選ぶには、その隠し場所を stash@{number} で示される。

ブランチごとの挙動にしたい場合は、ブランチ上でコミット(または複数のコミット)を行えばよいでしょう。 そのコミットは後でいつでも "unmake" することができます (たとえば git reset を使えば)。 --soft または --mixed を参照してください。 git reset ドキュメント をご覧ください。 git rebase -i で最終的なコミットだけを残し、一時的なコミットは破棄します)。

(本当にエミュレートするために git stash を本当にエミュレートするには、少なくとも二つのコミットが必要です。一つはインデックスの状態、もう一つはワークツリーの状態です。 しかし、インデックスの状態を保存したり復元したりする予定がないのなら、単に git add -A を実行し、それを一時的なコミットに含めることができます。 あるいは git stash はシェルスクリプトなので、これをコピーして修正すれば、デフォルトでブランチごとに動作させることができます。 refs/pb-stash/branch を作業用の名前空間として使用し、単一のグローバルな refs/stash を作業名空間として使用します。 それでも、明示的に名前を付けることによって、あるブランチから別のブランチに隠し場所を持ち込むことは可能です)。