git stashの使用目的は何ですか?


142

ブランチAで作業していて、ブランチAでのコミットの準備ができる前に突然ブランチBで作業する必要がある場合は、Aに変更を隠し、Bをチェックアウトし、そこで作業を行ってから、Aをチェックアウトして、スタッシュを適用します。

Aで作業していて、その日の作業を中止したい場合は、作業を隠して次の日に適用する(作業を再開する)か、そのままにしておく必要があります。作業ディレクトリ?セキュリティ上の利点がある場合を除いて、この場合にstashを使用する必要がある理由はわかりません。

また、別のシナリオ:私は職場と自宅の両方で働いています。家に帰りたいときにコミットの準備ができていない場合は、自分の作業を隠して、GitHubにプッシュしてから、そのスタッシュを自宅でプルできますか?


3
もしあれば、会社の方針に大きく依存します。「受け入れられた」答えをどのように選択しますか?
デーモンペインター

1
この質問のフレーズは、単に意見を求めているだけなので(この方法でgitを使用すべきかそれともそのように使用すべきか)、したがって、クローズするか編集する必要があります。
TylerH

回答:


161

Stashは便利な方法です。ブランチは非常に安価でgitでの管理が簡単なので、個人的には、ほとんどの場合、隠しておくよりも新しい一時的なブランチを作成する方を好みますが、それは主に好みの問題です。

私が隠しておくのが好きなのは、最後のコミットで何かを忘れていて、同じブランチの次のコミットにすでに取り掛かっている場合です。

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

2
足りなかった追加したものは、いったんスタッシュを外すとスタッシュにマージされますか?(私はまだgitのタイムラインがどのように機能するかについて不安定です-履歴を上書きしていると思いますか??)
Kiki Jewell

@KikiJewellでポップされた変更はインデックスに適用されます-コミットされません。したがって、git stash pop2度実行すると、これら2つの変更セットの違いが失われます。
Mureinik

2017年10月下旬の時点で、Gitメーリングリストについて広範な議論が行われています。そこでは、コマンドgit stash saveが非推奨になり、既存の代替案が優先されgit stash pushます。この主な理由は、あるgit stash push選択されたスタッシュのオプションが導入pathspecsは、何かがgit stash saveサポートしていません。
クリシュナグプタ

39

私は3つの段落で答えを壊します。

パート1:

git stash(コミットされていない変更を「スタッシュ」に保存します。注:これにより、作業ツリーから変更が削除されます!)

git checkout some_branch(目的のブランチに変更-この場合some_branch

git stash list (スタッシュをリスト)

あなたが見ることができます:
スタッシュ@ {0}:{} BRANCH_NAMEにWIPを:{SHA-1の最後のコミット} {最後のあなたのブランチのコミット}
スタッシュ@ {0}:マスター上WIP:テスト用085b095c6修正

git stash apply (現在のブランチの作業ツリーにstashを適用するため)

git stash apply stash@{12}(多くの隠し場所がある場合は、適用する隠し場所を選択できます-この場合、隠し場所を適用します12

git stash drop stash@{0}(スタッシュリストから削除するには-この場合はスタッシュ0

git stash pop stash@{1} (選択したスタッシュを適用し、スタッシュリストからドロップするには)

パート2:
このコマンドで変更を非表示にできますが、必須ではありません。
翌日も収納できます。
このコマンドは、変更を非表示にしてさまざまなブランチで作業するため、またはコードのいくつかの実装を実装し、ブランチやコミットなしでスタッシュに保存したり、カスタムケースをコミットしたりするためのコマンドです!
そして後であなたはいくつかの隠し場所を使うことができ、チェックする方が良いです。

パート3:
変更をローカルに非表示にするためのStashコマンド。
リモートで作業したい場合は、コミットしてプッシュする必要があります。


10

主なアイデアは

ダーティな作業ディレクトリの変更を隠しておく

したがって、基本的にStashコマンドは、必要のない変更や現時点で必要な変更を保持します。しかし、あなたはそれらを必要とするかもしれません。

作業ディレクトリとインデックスの現在の状態を記録したいが、クリーンな作業ディレクトリに戻りたい場合は、git stashを使用してください。このコマンドは、ローカルの変更を保存し、HEAD コミットに一致するように作業ディレクトリを元に戻します。


7

次のコマンドを使用できます。

  • コミットされていない変更を保存するには

    git stash

  • 保存した隠し場所を一覧表示するには

    git stash list

  • xが0、1、2 ...であるコミットされていない変更を適用/取得するには

    git stash apply stash@{x}

注意:

  • stashを適用してstashリストから削除するには

    git stash pop stash@{x}

  • stashを適用してstashリストに保持するには

    git stash apply stash@{x}


4

git stash(ステージング領域ではなく)作業コピーに変更があるときにヒットすると、gitは隠されたオブジェクトを作成し、スタッシュのスタックにプッシュします(以前と同じようにgit checkout -- .、変更は失われません)。後で、スタックの一番上からポップできます。


2

stashコマンドは、最後のコミット以降に行った変更を隠します。あなたの場合、次の日に作業を続けるつもりなら、隠しておく理由はありません。私はあなたがコミットしたくない変更を元に戻すためにstashのみを使用します。


2
いいえ、git stashブランチは変更されません。特に、コミットされた変更を「元に戻す」ことはありません。ファイルのコミットされていない変更は(一時的に)破棄されるだけです。-うるさいように見えるかもしれませんが、そのような単語はgitのコンテキストでは非常に特別な意味を持っています。あなたは本当にそれらを混同すべきではありません。
michas

ご指摘いただきありがとうございます。私はそれに応じて私の答えを変えました。
セヴェリン

gitでは、「ブランチ」は一連のコミットとして定義されています。git stashコミットには触れないので、ブランチをまったく変更しません。ブランチから何も「削除」せず、何らかの方法で「リセット」しません。ブランチは同じままで、作業ツリー内のファイルのみが変更されます。-それらは2つの全く異なるものです。
michas

変更は破棄されませんが、「隠しておく」ことができます。GitはスタッシュのLIFO構造を維持しているため、スタッシュは実際にはプッシュであり、そのトップからポップできます。「破棄する」という言葉は、何かを失うことを意味しますが、失うことはありません。
gyorgyabraham 2013

1

StackOverflowは意見に基づく回答の場所ではないことを知っていますが、実際には、隠し場所で変更を保留するタイミングについては良い意見があります。

実験的な変更をコミットしたくない

ワークスペース/ワーキングツリーに変更を加えるとき、マージ、プッシュ、フェッチ、プルなどのブランチベースの操作を実行する必要がある場合は、クリーンなコミットポイントにいる必要があります。したがって、ワークスペースの変更がある場合は、それらをコミットする必要があります。しかし、それらをコミットしたくない場合はどうなりますか?彼らが実験的である場合はどうなりますか?コミット履歴の一部にしたくないものはありますか?GitHubにプッシュしたときに他の人に見られたくないものはありますか?

ハードリセットでローカルの変更を失いたくない

その場合、ハードリセットを実行できます。しかし、ハードリセットを実行すると、ローカルの作業ツリーがすべて失われます。変更。これは、最後のコミット時の場所にすべてが上書きされ、すべての変更が失われるためです。

したがって、「いつ格納するべきか」という答えは、同期された作業ツリー/インデックス/コミットを使用してクリーンなコミットポイントに戻る必要があるが、ローカルの変更を失わないようにする必要がある場合の答えです。プロセス。変更を隠し場所に保管するだけで大​​丈夫です。

そして、スタッシュを実行し、マージまたはプルまたはプッシュしたら、ポップまたは適用スタッシュするだけで、元の場所に戻ることができます。

Git stashとGitHub

GitHubは常に新しい機能を追加していますが、現時点では、そこに隠しておく方法があります。繰り返しますが、隠し場所のアイデアは、それがローカルでプライベートであるということです。ワークステーションに物理的にアクセスすることなく、他の誰もあなたの隠し場所を覗くことができません。git reflogがプライベートで、git logがパブリックであるのと同じ方法です。GitHubにプッシュされた場合、おそらくプライベートではありません。

1つのトリックは、ワークスペースのdiffを実行し、その差分をgitリポジトリにチェックインして、コミットしてからプッシュすることです。次に、自宅からプルし、差分を取得してから、それをほどくことができます。しかし、それはそれらの結果を達成するためのかなり厄介な方法です。

git diff > git-dif-file.diff

隠しておく

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