git-stashとgit-branch


92

では、前のGitの質問、ダニエルBenamyはGitのワークフローについて話していました。

私はマスターに取り組んでいて、いくつかのことをコミットしてから、その仕事を保留にしたいと思いました。いくつかのコミットをバックアップし、がらくたの仕事を始める前から分岐しました。

彼は、現在の変更を失うことなく、自分の作業状態を以前の時点に戻したいと考えていました。すべての答えは、さまざまな方法で、

git branch -m master crap_work
git branch -m previous_master master

これはどのように比較しgit stashますか?すべての処理がすでに分岐によって処理されているように思われる場合に、ここで別の使用例を確認しようとすると少し混乱しますgit stash


@ ジョルディバンスター:ありがとう、それは物事を片付ける。「隠しておく」ことは、軽量で名前のない、ブランチのようなものだと私は考えていると思います。スタッシュでできることは何でも、ブランチもできますが、もっと多くの言葉があります。いいね!

回答:


109

'stash'はコミットされていない、 " ダーティ作業コピー上」なものをそれを隠して、クリーンな作業コピーを残します。

実際にはまったく分岐しません。その後、他のブランチの上に隠しておくことができます。または、Git 1.6以降では、次のことができます。

git stash branch <branchname> [<stash>]

新しいブランチの上にスタッシュを適用するには、すべて1つのコマンドで行います。

したがって、まだ「間違った」ブランチにコミットしていない場合、stashはうまく機能します。

既にコミットしている場合は、質問で説明するワークフローがより良い代替案です。ちなみに、あなたの言うとおりです。Gitは非常に柔軟であり、その柔軟性によって機能が重複しています。


1
私に噛み付く一つのこと... [<stash>]が実際にどのように見えるか書くことができます!彼らはそれをドキュメントのその表記法に入れましたが、それが1であるか@ {1}であるか、または何であるかは明らかではありません。
グレッグ・リンド

1
特定のスタッシュ「N」を参照する場合は、stash @ {N}を使用します
ジョルディバンスター2009

9
git stash list隠し場所の名前については、を参照してください。
idbrii

6
グレッグ、はい、できます:git stash save(stashの名前)。たくさん使うと、それぞれの隠し場所が何であるかがわかるので、より便利になります。git stash show -p(name)を使用して、stashのパッチを表示できます。
Thomas Vander Stichele、2011年

7
また、git stash show -u作業コピーに対する隠し場所の差分を表示します。
ケン

49

stashを復元すると、変更が再適用され、コードの作業が続行されます。

現在の変更を隠すには

$ git stash save 
Saved "WIP on master: e71813e..."

複数の隠し場所を持つこともできます。スタッシュはスタックのように機能します。新しいスタッシュを保存するたびに、スタックの一番上に置かれます。

$ git stash list
stash@{0}: WIP on master: e71813e..."

そのstash@{0}部分に注意してください?これがスタッシュIDです。後で復元するときに必要になります。今それをやってみましょう。stash IDは、行うstashごとに変わります。stash @ {0}は、最後に作成したstashを指します。

隠し場所を適用するには

$ git stash apply stash@{0}

あなたがそれを適用した後、隠し場所がまだそこにあることに気付くかもしれません。不要になった場合はドロップできます。

$ git stash drop stash@{0}

または、スタッシュはスタックのように機能するので、最後に保存したスタッシュをポップすることができます。

$ git stash pop

すべての隠し場所を一掃したい場合は、「clear」コマンドを実行します。

$ git stash clear

スタッシュをそれほど頻繁に使用しないことも十分考えられます。変更をすばやく隠して後で復元したい場合は、stash IDを省略できます。

$ git stash
...
$ git stash pop

いくつかの本当に重要な作業でスタッシュを使用する前に、スタッシュを自由に試してください。

また、このブログのより詳細なバージョンをブログに投稿しています。


想定される「最良の」回答よりもはるかに役立つリソース...(最良の回答はそれを明確にしましたが、完全な使用法に関していくつかの混乱がありました)
kumarharsh

9

私はいつもgit stashに警戒しています。あなたが数回隠しておくと、物事は厄介になる傾向があります。git stash listは、作成したスタッシュの番号付きリストを表示し、提供した場合はメッセージも表示します...しかし、問題は、残忍なgit stash clear(すべてを削除する)を除いてスタッシュをクリーンアップできないことにあります。 。したがって、隠し場所についての超説明的なメッセージを常にアナルで送っていない限り(ちょっと隠し場所の哲学に反することになります)、隠された隠し場所の束になってしまいます。

私が知っている唯一の方法は、どれがgitk --allを使用して隠し場所を見つけるかです。少なくともこれにより、スタッシュが作成されたコミット、およびそのスタッシュに含まれるすべての差分が表示されます。

私はgit 1.5.4.3を使用していることに注意してください。1.6ではgit stash popが追加されると思います。選択したstash 適用してリストから削除すると思います。とてもきれいに見えます。

今のところ、絶対にポジティブでない限り、常にブランチを試みます。1時間以内であっても、同じ日にそのスタッシュに戻るつもりです。


3
有用な名前を付けずにブランチを作成しますか?そうでない場合は、なぜstashで同じことをしないのかわかりません。それらが本当に何を含んでいるか知りたい場合は、git-stash showを使用して変更されたファイルを表示するか、git-stash applyとgit-diffを使用して実際の差分を確認します。スタッシュをトリミングしておくことは、ブランチを管理しておくことと同じです。
Xiong Chiamiov 2009

18
実際には、次を使用して1つのgit stash drop [<stash>]
スタッシュ

1
確かに、gitは長い間git stashを落としてきました。現在使用するPITAははるかに少なくなっています。私は毎日、そして長期間にわたってさえ、それを使用しています。
webmat

3

git stashよりも適切なワークフローを探す場合は、git-bottleを調べてください。これは、さまざまなgitの動作状態を通常のgitコミットとして保存および復元し、作業ツリーの現在の適切な状態とgitステータスの下に表示されるすべてのさまざまなファイルの状態を効果的にスナップショットするためのユーティリティです。

との主な違いgit stash

  • git stashダーティgit状態を狭く保存します(変更されたファイル、およびインデックスに追加されたファイル)。一方、とは異なるすべてgit-bottleを保存するように設計さHEADれており、変更された、変更された、および追加されていない、追加されていない、マージされていないパスを保持する方法を区別します。完全なリベース/マージ状態(下のパスのみ.gitignoreが保存されません)。
  • git stash個別に追跡する必要があるオブジェクトをstashオブジェクトに保存します。2週間前に何かを隠しておいたとしたら、覚えていないかもしれませんが、現在のブランチへの仮コミットgit-bottleとして保存します。逆のアクションは、ポップと同等です。これらのコミットをリポジトリ間でプッシュして共有することが可能です。これは、リモートサーバーに別のリポジトリがあり、ビルドのためだけに、または競合解決で他の人と共同作業するためのリモートビルドに役立ちます。git-unbottlegit stash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.