web-dev-qa-db-ja.com

ローカルの変更にgit stash saveまたはgit commitを使用しますか?

リポジトリ内のいくつかのファイルを変更しましたが、それらをパブリックにプッシュしたり、一時的なブランチを作成して保存したりしたくありません。これらの変更をどこかに保存したいだけです。だからどちらのコマンドが良いですか:

git stash save "save message" 

または

git commit -am "save message"

私がgit commitを使用する場合、私のすべてのローカルコミットが1つのgit Pushコマンドによってパブリックにプッシュされるのは本当ですか?それらの中で特定のコミットを1つだけプッシュしたい場合はどうなりますか?

21
Balthier

プッシュするときは、常に1つの特定のコミット(通常は、現在チェックアウトされているブランチの先端にあるコミット)をプッシュします。ただし、コミットのハッシュはベースとなるコミット(その親コミット)で部分的に構成されるため、haveを使用してすべての親コミットもプッシュします。また、親コミットをプッシュすることにより、親コミットもプッシュする必要があります。したがって、特定のコミットの履歴全体をプッシュすることしかできません。

何かを保存するだけでプッシュではないコミットを作成する場合は、そのコミットをプッシュしたり、そのコミットに基づくコミットを実行したりしないようにする必要があります。これを行うには、一時コミットに基づく作業を行った後、一時コミットをプッシュして作成した新しいコミットに押し込む必要があります。

つまり、はい、一時的なプライベートストレージにコミットを使用できます。ただし、スタッシュ機能を使用する方がはるかに簡単です。実際、この機能はmadeです。

16
Oznerol256

個人的には、プライベート(ローカル)ブランチに直接行く方が好きですが、隠し場所は機能します。スタッシュについて2つのことに注意してください。

  • 彼らは彼ら自身のコミットです。ラベルを除いて、「stash」コミットとブランチまたはタグラベルに関連付けられたコミットとの間に基本的な違いはありません。 (タグラベルの形式はrefs/tags/tag-fooです。ブランチの形式はrefs/tags/branch-foo;で、単一のラベルが付けられたstash commitはrefs/stashというラベルが付けられます。もちろん、ブランチラベルにも「自動的にコミットを追加すると移動する」機能ですが、コミットを追加しないと移動しないので、1つのコミットを保存するのと同じように機能します)。
  • 隠し場所「スタック」1 reflogsを使用して実装されます。 Reflogs can有効期限-デフォルトではほとんどが有効(30日または90日後)であり、refs/stashの有効期限はありませんが、構成エントリで変更できます。そのため、スタックスタッシュコミットも可能です "期限切れ」(reflogエントリが期限切れになると同時に)。 (より正確には、これらは「収集可能」になりますが、この区別がなくなっている場合は役に立ちません。:-))

隠し場所の目的は、短期的に何かを保存することです。レポに遅れて戻ってきて、すべて「WIPオンブランチ」という名前のスタッシュを見つけたことがあれば、それを理解しようとしても面白くないでしょう。

その他の機能/バグ:-) stashは以下を提供します:

  • git stash branchを使用すると、事後に気が変わって、隠し場所をブランチに変えることができます。したがって、「短期」が問題であることが判明した場合(今日の午後に修正する予定でしたが、現在は少なくとも1か月はプッシュされていないため)、結局、スタッシュをブランチに変えることができます。
  • git stash apply [--index]は、現在のブランチに適用された変更を「再作成」するために最善を尽くします。 --indexを使用すると、ステージングされた変更とアンステージングされた変更の両方を個別に復元しようとします。 (ただし、これが不可能な場合もあります。)
  • git stash popはstash参照を自動的に破棄します。 git stash pop --indexを使用するつもりで--indexの部分を省略した場合でも、残念ながらこれは行われます。 popを使用すると、一部の状態(ステージング状態と非ステージング状態)が失われやすくなります。 applyを使用し、後でdropを使用して、すべてが意図したとおりに戻っていることを確認したら、この問題を回避できます。

git stash branch--indexを意味することに注意してください。新しく作成されたブランチには、ステージングおよびアンステージングされた変更が、git stashを実行したときの状態に復元されます。 (ブランチは、git stashを実行したときのコミットから分岐します。)変更をコミットします(必要に応じて、git add- ingを2回実行するか、2つの個別のコミットとして実行します)。そもそもプライベートブランチを作成したかのように進んでください。


1スタックの期限切れ可能部分は、stash@{0}出力のgit stash list以外のすべてのスタッシュで構成されています。

4
torek

隠しツールを使用することをお勧めします。それがここにある理由です。 chngesを隠して、後でコードに追加できます。 git stashで使用できる機能は他にもたくさんあります。こちらがリンクです http://git-scm.com/book/en/Git-Tools-Stashing

一度git here のドキュメントを一読することをお勧めします。ツールについてもお読みください。これであなたはきっとgitの達人になるでしょう。

0
Jatin Malwal

私は少し違うことをします。 Stashesは、実際の隠し場所が(簡単に)細かくないため、日常の作業ではなく、迅速な保存に適しています。 (つまり、20個の変更されたファイルがあり、それぞれ10個のスタッシュを2つ作成する場合、それは簡単ではありません。)

そのため、私は個人的な使用のためにのみ一時的なブランチではありますが、実際の日常の変更をコミットして、作業のメモなどを含めることができます。毎日のチェックイン、実験など。基本的に私はしないでください最後のレポにプッシュしたい。

メインリポジトリにコミットする準備ができている状態になったら、最初に分岐したコミットで「ソフトリセット」コマンドを使用します。これにより、私の一時的なブランチでコミットされたすべての変更が、毎日の作業履歴なしで、元のコミットの現在の変更として戻されます。

次に、これらの「新しい」変更のために新しいブランチを作成し、それらを一度にコミットするか、意味がある場合はいくつかのコミットに分割することができます(つまり、1つはバックエンドのもの、もう1つはフロントエンドのものです。最後のもの、別のリソースなど)

完了すると、他の開発者にとって意味のある履歴があり、毎日のメモがなく、マージしてメインリポジトリにプッシュバックする準備ができた、素敵で新しいクリーンなブランチが残ります。次に、tempブランチを削除して、次のタスクに進みます。

要約すると...

  1. 作業ブランチを作成する
  2. 仕事を完了するために必要な数のコミット/サブブランチを作成する
  3. その履歴を保持せずにマージする準備ができたら、git-resetを分岐した元のコミットに戻します。すべての変更はローカル変更です。
  4. 必要に応じて、再コミットしてマージします

別の利点は、一時的なブランチをリモートリポジトリに実際にプッシュできるため、スタッシュでは実行できない複数の場所から作業できることです。完了したら、サーバーからクリーンアップして、リポジトリの参照をクリーンに保つようにしてください。 (技術的にはコミットがまだ存在し、デタッチされているだけであると主張する人もいますが、ブランチはGITで軽量であり、デタッチされたコミットを取り戻すことができるため、作業を失わないための別のセーフティネットになります本当に必要な場合)

0
Mark A. Donohoe