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


95

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

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

回答:


43

現在のスタッシュスタックを確認するには:

git stash list

スタックから特定のスタッシュを選択するには、上記のようにそれを参照してください。stash@{number}

動作をブランチごとにしたい場合は、ブランチでコミット(または複数のコミット)を行うことができます。後でいつでもコミットを「アンメイク」することができます(たとえば、、、またはのgit resetいずれかを--soft使用し--mixedます。gitresetのドキュメントを参照してください。またはgit rebase -i、一時的なものを破棄する間、最終的な「実際の」コミットのみを保持します)。

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


stash list説明だけでなく、各アイテムのファイルリストを表示する方法を知っていますか?
水陸両用2013

2
git stash show(またはバージョンgit stash show stash@{<number>}以外の場合@{0})は、diff --stat;を提供します。-p差分を大きくするには、を追加します。注:これは、「スタッシュバッグ」内の「ワークツリー」を、ハングしたコミットと比較します。特定のスタッシュバッグの「インデックス」に何が含まれているかを確認するためのフロントエンドインターフェイスはありません。
torek 2013

55

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

ここではそれを使用する方法の素敵なページです。


2番目の隠し場所は最初の隠し場所を上書きしますか?IOW、2つのスタッシュを実行したが、その間にアンスタッシュがない場合、最初のスタッシュを失いますか?
水陸両用2013

1
いいえ、スタッシュのスタック(後入れ先出し)を取得します。スタッシュをスタッシュスタックにプッシュし、次に別のスタッシュを押してから2番目をポップアウトし、次に最初をポップアウトします。
abasterfield

18

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

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

これは、commitandresetコマンドの値と使用法を示す一般的な実際のシナリオです。

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

(FYIのデフォルトgit reset--mixed


2
このシナリオでリセットするための便利なショートカットはgit reset HEAD~1です。
Sam

1
@samHH git reset HEAD ^ 1が誤って2回ヒットしたインスタンスが多すぎるので、HEAD^1またはを使用しないことを選択しますHEAD~1
Trevor Boyd Smith

11

ここでのすべての回答がcommit+で隠し場所をエミュレートすることを提案する理由がわかりませんreset。Stashは、特に複数のブランチで作業する場合は、まったく問題なく使用できます。また、複数のブランチで作業しているときにコミットしたくありません。戻ったときに、変更されたすべての変更がエディターで引き続き強調表示されるようにするためです。

だからここに隠しワークフローがあります:

ブランチを切り替える必要があり、コミットする準備ができていないときはいつでも、変更をスタックに保存してください

git stash save "Your custom stash message"

ブランチに戻ったら、隠し場所をチェックアウトしてください

git stash list

ここに画像の説明を入力してください

ブランチにいるFixIssue0203場合はgit stash pop、これがトップを適用するため、useを使用できますstash@{0}スタッシュから削除。

ただし、ブランチ内のImproveReadme場合は、最初にstash 1git stash apply stash@{1}を適用してから、スタックからstash1を削除する必要がありますgit stash drop stash@{1}

それでおしまい!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.