95

以前のGit に関する質問で、Daniel Benamy は Git のワークフローについて話していました。

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

彼は、現在の変更を失うことなく、作業状態を以前の時点に復元したいと考えていました。すべての答えは、さまざまな方法で、次のようなものを中心に展開しました

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

これは と比べてgit stashどうですか? すべてがすでに分岐によって処理されて いるように見える場合、ここで別のユースケースが何であるかを確認しようとして少し混乱しています…</p>git stash


@ Jordi Bunster : ありがとうございます。「スタッシング」は、軽量で名前のないブランチのようなものだと考えていると思います。したがって、stash で実行できることはすべてブランチでも実行できますが、より多くの単語が必要です。良い!

4

4 に答える 4

111

'stash' は、コミットされていない作業コピーの「汚い」ものを取り、それを隠して、クリーンな作業コピーを残します。

本当に枝分かれしません。その後、スタッシュを他のブランチの上に適用できます。または、Git 1.6 以降では、次のことができます。

git stash branch <branchname> [<stash>]

すべて 1 つのコマンドで、新しいブランチの上に stash を適用します。

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

すでにコミットしている場合は、質問で説明したワークフローがより良い代替手段です。ところで、その通りです。Git は非常に柔軟であり、その柔軟性によって重複する機能がもたらされます。

于 2008-09-02T15:54:59.953 に答える
49

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

現在の変更を隠すには

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

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

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

stash@{0}部分に注意してください。それがあなたのスタッシュ ID です。後で復元するために必要になります。今すぐそれをしましょう。スタッシュ ID は、スタッシュを作成するたびに変わります。stash@{0} は、最後に作成した stash を参照します。

スタッシュを適用するには

$ git stash apply stash@{0}

スタッシュを適用した後も、スタッシュがまだそこにあることに気付くかもしれません。必要がなくなったらドロップできます。

$ git stash drop stash@{0}

または、stash はスタックのように機能するため、最後に保存した stash を取り出すことができます。

$ git stash pop

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

$ git stash clear

スタッシュをそれほど頻繁に使用しない可能性があります。変更を後で復元するためにすばやくスタッシュしたい場合は、stash ID を省略できます。

$ git stash
...
$ git stash pop

本当に重要な作業に使用する前に、気軽にスタッシュを試してみてください。

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

于 2009-06-05T12:50:57.587 に答える
11

私は常に git stash を警戒しています。数回隠しておくと、物事がぐちゃぐちゃになる傾向があります。git stash list は、作成したスタッシュの番号付きリストを表示し、それらを提供した場合はメッセージを表示します...しかし、残忍な git stash clear (すべてを削除する) を使用しない限り、スタッシュをクリーンアップできないという事実に問題があります。 . そのため、スタッシュに対して常に非常に説明的なメッセージを一貫して提供していない限り (スタッシュの哲学に反するようなものです)、理解できないスタッシュの束になってしまいます。

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

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

今のところ、1時間以内であっても、同じ日にその隠し場所に戻ることが絶対に確実でない限り、私は常に分岐しようとしています.

于 2008-09-25T17:53:27.220 に答える
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
于 2015-07-19T04:55:05.760 に答える