git stash popとgit stash applyの違い


1024

私はgit stash popかなり長い間使用しています。最近git stash applyコマンドについて知りました。試してみたところ、と同じように動作したようgit stash popです。

違いは何であるgit stash popとはgit stash apply

回答:


1628

git stash pop 捨てる一方で、それを適用した後(デフォルトでは、最上位の)スタッシュをgit stash apply スタッシュリストに葉それを(その後、またはあなたができることができ、後で再利用するためgit stash dropに)。

これはgit stash pop、の後に競合がない限り発生します。その場合、スタッシュは削除されず、のように動作しますgit stash apply

それを見る別の方法:git stash popgit stash apply && git stash dropです。


117
以下の@briankipの回答注記のように、スタッシュがポップされたときに競合が発生した場合、ポップはスタッシュを削除しません(適用とまったく同じように動作します)
Kashif

ブランチのステージングされていない変更がgit stash popの結果と同じであっても、競合エラーが発生するようです。
DimP 2018

79

John Zwinckが述べたように、違いを示すこの役立つリンクを入手しましたgit stash pop

たとえば、スタッシュされた変更が、スタッシュを最初に作成してから行った他の変更と競合するとします。popとapplyはどちらもマージ競合解決モードを有効にトリガーし、そのような競合を適切に解決できるようにします。また、おそらくpopも期待しているとしても、どちらもstashを取り除くことはありません。多くの人々はスタッシュが単純なスタックであることを期待しているため、多くの場合、スタッシュはなくなったと思っていたため、後で同じスタッシュを誤ってポップすることになります。

リンク:http : //codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/


6
ポップが失敗したときにスタッシュが残るという事実は、最初はそのように思えるかもしれませんが、実際には欠点ではありません。
アマルゴビナス2017

65

git stash pop最上位の隠し要素を適用し、スタックから削除します。git stash apply同じことをしますが、スタッシュスタックに残します。


43

実際に見てみると、違いを理解するのに役立ちます。

masterブランチで作業していて、hello.txt「Hello」文字列を含むファイルがあるとします。

ファイルを修正して、それに "world"文字列を追加しましょう。次に、別のブランチに移動して、今見つけた小さなバグを修正したいのでstash、変更する必要があります。

git stash

他のブランチに移動してバグを修正したmasterので、ブランチで作業を続ける準備ができたので、次popの変更を行います。

git stash pop

スタッシュの内容を確認しようとすると、次のようになります。

$ git stash show -p
No stash found.

ただし、git stash apply代わりに使用すると、隠されたコンテンツが取得されますが、保持されます。

$ git stash show -p
diff --git a/hello.txt b/hello.txt
index e965047..802992c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-Hello
+Hello world

つまりpop、スタックのpopと同じです。実際には、popされると要素を削除しますが、peekのapplyようです。


5

ではgit スタッシュ現在変更されたファイルを移動することが可能な記憶領域です。

stashareaは、gitリポジトリからいくつかの変更をプルし、リポジトリで利用可能ないくつかの相互ファイルでいくつかの変更を検出したい場合に役立ちますgit

git stash apply //apply the changes without removing stored files from stash area.

git stash pop  // apply the changes as well as remove stored files from stash area.

注:git apply-stashエリアからの変更のみを適用し、エリアから変更をgit pop適用および削除しstashます。


1

Git Stash Pop vs applyワーキング

トップに隠された変更を現在の非ステージングされた変更に適用し、そのスタッシュも削除したい場合は、に進みますgit stash pop

# apply the top stashed changes and delete it from git stash area.
git stash pop  

ただし、トップスタッシュされた変更を削除せずに現在の非ステージング変更に適用する場合は、に進みますgit stash apply

注:このケースをStackクラスpop()peek()メソッドに関連付けることができます。ポップはトップをデクリメント(top = top-1)ずつ変更peek()しますが、トップの要素のみを取得できます。

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