特定のファイルのみをアンスタッシュする方法は?


386

変更を隠しておきました。今、私はstashからいくつかのファイルだけをunstashしたいと思います。これどうやってするの?


4
スタッシュ全体を適用する必要があると思いますが、選択的に再スタッシュできます。
Richard

4
@AbdouTahiri隠し場所の何が問題になっていますか?
アレックス

32
@AbdouTahiri Uhhhh .. git stashは正当な機能であり、非常に便利です。毎日使っています。たとえば、同僚が何かを検討する必要があるが、私は複雑な変更セットの真ん中にいるとします。分岐を切り替えるために、壊れたコードの山をコミットするつもりはありません。隠し、ブランチを切り替え、確認し、元に戻し、隠します。誰が、またはなぜ git stashが「推奨されない」と思われるのかについて詳しく説明しますか?理由だけで、あなたのgitのstash履歴は読み取りにアップマディードとハードされる平均皆よそにないです。乱雑なgit stashセットは単に悪いワークフローであり、Gitの欠陥ではありません。
dudewad 2016年

6
@alexなし。git stashに問題はありません。それを使い続けなさい。
dudewad 2016年

回答:


461

下記、及びで詳述「どのように私はGitのスタッシュから単一のファイル(またはファイルへの変更)を抽出しますか?」、あなたが使用することを適用することができgit checkoutたりgit show、特定のファイルを復元します。

git checkout stash@{0} -- <filename>

これは上書きますfilename。ローカルでの変更がないことを確認してください。そうでない場合は、隠しておいたファイルをマージすることをお勧めします

Jaime Mがコメントしたように、特殊文字をエスケープする必要があるtcshのような特定のシェルでは、構文は次のようになります。 )git checkout 'stash@{0}' -- <filename>

または別のファイル名で保存するには:

git show stash@{0}:<full filename>  >  <newfile>

(ここ<full filename>に、プロジェクトのトップディレクトリに対するファイルのフルパス名があることに注意してください(:を基準にしてくださいstash@{0}))。

ユーサーはコメントで示唆しています

そのファイルから適用する変更を手動で選択する場合:

git difftool stash@{0}..HEAD -- <filename>

Vivekコメントに追加:

git checkout stash@{0} -- <filename>」のように見えますが、stashが実行された時点のファイルのバージョンが復元されます。そのファイルのstashされた変更は(ただ)適用されませ
後者を行うには:

git diff stash@{0}^1 stash@{0} -- <filename> | git apply

peterflynnによるコメントのように、場合によっては、従来のdiffパスから()の先行スラッシュを1つ削除する必要があります)| git apply -p1p1


コメントしたとおり:「unstash」(git stash pop)、次に:

  • 保持したいものをインデックスに追加します(git add
  • 残りを隠します: git stash --keep-index

最後のポイントは、他のファイルを隠しながら、いくつかのファイルを保持できるようにすることです。
これは、「変更された複数のファイルから1つのファイルのみを隠しておく方法」に示されています


5
これはgit stash pop、ファイルの競合が原因でできない場合は機能しません。その場合、バラムルガンAの答えが私にとってはうまくいきました。
Andrey 14

1
そのファイルから適用する変更を手動で選択する場合は、git difftool stash @ {0} .. HEAD-<filename>
yucer

5
「git checkout stash @ {0}-<filename>」のように見えますが、stashが実行された時点のファイルのバージョンが復元されます。そのファイルのstashされた変更は(ただ)適用されません。後者を行うには: "git diff stash @ {0} ^ 1 stash @ {0}-<filename> | git apply"
Vivek

1
@JaimeM。ありがとうございました。見やすくするために、回答にコメントを含めました。
VonC、2017

1
それがをunstash意味すると仮定するとpop、おそらくほとんどの場合そうなると思われるので、これは質問に部分的にしか答えません。その後、残りの変更をポップするときの競合や混乱を避けるために、選択的に適用されたピースをスタッシュからどのように削除しますか?
DylanYoung

115
git checkout stash@{N} <File(s)/Folder(s) path> 

例えば。最後に隠しておいた./test.cファイルと./includeフォルダーのみを復元するには、

git checkout stash@{0} ./test.c ./include

12
これが正解です。特定のファイルから隠された変更のみを適用する単一行コマンドは、魅力のように機能します!
レベル2014年

1
ファイルの隠された変更を(ただ)適用するには: "git diff stash @ {N} ^ 1 stash @ {N}-<filename> | git apply"
Vivek

これも私にとってはうまくいきます。stashから使用するために必要なファイルを選択的にチェックアウトすれば完了です。-a隠し場所を作成しているときに使用したフラグにスタックしました。
Rajeev Ranjan 2017年

1
@ 4levels「stashされた変更を適用する」とは何が起こるのではないと思いますよね?私は「stashからのコピーであなたが持っているものをすべて上書きする」ことが起こると思います。
msouth

35

VonCの答えはおそらくあなたが望むものだと思いますが、選択的な「git apply」を行う方法は次のとおりです。

git show stash@{0}:MyFile.txt > MyFile.txt

4
これが必要な場合もありますが、このコマンドは作業ディレクトリの変更とマージするのではなく上書きすることに注意してください。
Rhubbarb 2015年

stashにのみ存在し、checkout何も気にしないファイルをコピーしたいだけなので、これは私にとってはうまくいきます。
トムラッセル

1
Windows PowerShellの場合:git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt- PSは特別に中括弧を解釈しないようにするためにバッククォートが必要であり、かつsc必要であるPSのため、>オペレータのデフォルトはUTF-16(実際にはUCS-2)には、おそらくない何をしたいです。@バラムルガンAの答えはこれらの問題に悩まされることはありません。
Ian Kemp 2017年

19

最初にすべての隠し場所をリストします

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

次に、スタッシュにあるファイルを表示します(スタッシュ1を選択します)。

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

次に、目的のファイルを適用します。

git checkout stash@{1} -- <filename>

またはフォルダ全体:

git checkout stash@{1} /errors

なしでも動作--しますが、使用することをお勧めします。これを投稿を。

また、オプションの解釈を停止し、後続のすべての引数を文字どおりに処理するための信号として、二重ハイフンを認識することも一般的です。


1
この編集により、それはより明確になります。+1
VonC 2018

1
多くの方法を試しましたが、この方法が必要でした。git stash pop追跡されていないファイルに対してエラーをスローする問題に直面しました。ありがとうございました。
Ramin Firooz 2018

10

あなたがgit stash pop(衝突なしで)それを適用した後、隠し場所を削除します。しかし、あなたgit stash applyがstashリストから削除せずにパッチを適用する場合。次に、不要な変更を元に戻すことができますgit checkout -- files...


2
この投稿の競合部分を明確にするために、競合が発生している場合はgit stash pop、手動で修正する必要があり、スタッシュは削除されません。
Thomas McCabe

6

もう1つの方法:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

2
これが唯一の正解IMOです。変更を適用するだけでなく、checkoutまたはshowを使用すると、ファイルが盲目的に上書きされます。「もう1つの方法」は控えめな表現です。
派手な

1
path/to/file2あなたがあなたのワークスペースの同じファイルと比較したいので、私は得ていません。2番目のパスを除外しても、私には問題ありません。-そして、-Rオプションを使用してエラーメッセージが表示されます(「パッチを逆に適用します」、隠してあるバージョンにパッチを適用しようとしますか?!)。だから私の作業バージョンは次のようになりgit diff stash@{N}^! -- path/to/file | git apply -ます。
ThomasH

「パッチに失敗しました」?3方向マージを試してください。...| git apply -3 -
John Mee

6

Windowsユーザーの場合:中かっこはPowerShellでは特別な意味があります。一重引用符で囲むか、バックティックでエスケープできます。例えば:

git checkout 'stash@{0}' YourFile

これがないと、エラーが発生する可能性があります。

Unknown switch 'e'


3
今月見た中で最も役に立たないユーザーメッセージに対するPowerShellへの満点。
holdenweb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.