web-dev-qa-db-ja.com

git stashはブランチ固有ですか、それともリポジトリ全体ですか?

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

git stashブランチ固有ですか、それともリポジトリ全体ですか?リポジトリ全体の場合、オプションを渡してブランチ固有にすることはできますか?

65
amphibient

現在のスタッシュスタックを表示するには:

git stash list

スタックから特定のスタッシュを選択するには、上記のstash@{number}で参照します。

動作をブランチごとにしたい場合は、ブランチでコミット(または複数のコミット)を行うことができます。後からいつでもコミットを「アンメイク」できます(たとえば、git reset--softまたは--mixedのいずれかで、 git reset documentation ;またはwith git rebase -iは、一時的なデータを破棄しつつ、最終的な「実際の」コミットのみを保持します)。

(実際にgit stashをエミュレートするには、少なくとも2つのコミットが必要です。1つはインデックス状態用、もう1つはワークツリー状態用です。ただし、インデックス状態を保存および復元する予定がない場合は、git add -Aワークツリー全体の状態を一時コミットに入れます。または、git stashはシェルスクリプトであるため、デフォルトでブランチごとに動作するように簡単にコピーおよび変更できます。たとえば、リポジトリ全体の単一のグローバルrefs/pb-stash/branchではなく、refs/stashが作業ネームスペースとして使用されます。明示的に名前を付けることで、あるブランチから別のブランチにスタッシュを持ち込むことができます。

28
torek

いいえ、いいえ。gitstashはリポジトリごとです。

ここ は、使用方法に関する素晴らしいページです。

40
abasterfield

git stashはブランチごとではありません。

  • git stashの代わりに(たくさんの隠し場所やブランチがあると簡単に失われる可能性があります)
  • 未完成のコードをブランチに保存するためにgit commitを実行することをお勧めします。コードを完成する準備ができたら、未完成のコードを取り戻すためにgit reset ${COMMIT_HASH_VALUE}を実行します
  • git commitおよびgit resetを使用するとtogetherは特定のブランチのgit stashを正しくシミュレートできます

commitおよびresetコマンドの値と使用法を示す一般的な実際のシナリオを次に示します。

  • あなたは機能ブランチXで作業しており、あなたのコードはテストをコンパイルしたりパスしたりさえしません
  • 現在の新機能よりも優先度の高いバグがあるため、バグ修正にすぐに取り組み始める必要があります
  • git stashを行うのではなく(多くのstashと多くのブランチがあるため、stashはミックスで失われます)
  • 機能ブランチX でgit commitを実行できます。
    • COMMIT_HASH_VALUEを書き留めます
  • ホットフィックスの新しいブランチYをチェックアウトします
  • ブランチYでホットフィックスを終了します(マージリクエストを実行して、ホットフィックスをベースラインに取得し、ホットフィックスブランチを削除します)
  • 次に、機能ブランチXを再度チェックアウトします
  • コンパイルまたはテストに合格しなかった未完成の作品をポップする->単にgit reset ${COMMIT_HASH_VALUE}を実行する

(FYI git resetのデフォルトは--mixedです)

10