特定のファイルをgitstashするにはどうすればよいですか?


1651

保存しようとしている隠し場所から現在変更されている他のファイルを残して、特定のファイルを隠します。

たとえば、git statusでこれが得られた場合:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

app / views / cart / welcome.thtmlのみを隠したいのですが、どうすればよいですか?次のようなものです(ただし、もちろんこれは機能しません):

git stash save welcome_cart app/views/cart/welcome.thtml

57
「重複の可能性がある」質問には、現在、受け入れ済みとしてマークされた不正解があります。
ペンギンブライアン

6
使用git checkout -- filenameして元の状態に戻すことができます。
visualex

7
@visualexそれは確かにそれを元に戻しますが、それを隠しません
Jesper

2
Re Penguin Brianのコメント:はい、「重複の可能性がある」質問に対する受け入れられた回答は、最近のバージョンのgitのこの質問にリンクしています。
火星

1
$ gitの隠し場所-ファイル名。拡張子
Linielson

回答:


2504

編集: git 2.13以降、stashへの特定のパスを保存するコマンドがあります:git stash push <path>。例えば:

git stash push -m welcome_cart app/views/cart/welcome.thtml

古い答え:

git stash --patch(またはgit stash -p)を使用してこれを行うことができます。インタラクティブモードに入り、変更された各ハンクが表示されます。使用して、nあなたは、隠しておくにしたくないというファイルをスキップするにはy、あなたが隠したいと1が発生したとき、およびq終了し、unstashed残りのハンクを残すこと。 a表示されたハンクと残りのハンクをそのファイルに隠します。

最もユーザーフレンドリーなアプローチではありませんが、本当に必要な場合は作業を完了します。


32
面倒ですが、機能します。ステージングされた変更のみを隠し、後でポップされたときにステージングされていない作業ツリーに変更を入れる簡単な方法があればいいのにと思います。
James Johnston

55
@JamesJohnstongit stash --keep-indexを使用すると、ステージングされていないすべての変更を隠しておくことができます(探しているものの反対)。stackoverflow.com/a/8333163/378253
nimser 2013年

123
あなたayそれの代わりに言うならば、それはその塊+ファイルの残りを隠します、そしてそれははるかに速いです。
i_am_jorf 2013年

53
@jeffamaphone素晴らしい!またd、逆のことを行います。つまり、現在のファイルにそれ以上のハンクを隠しません。そして実際?にすべての可能なオプションが表示されます。
omn​​ikron 2013

9
@Vencovskyこれは「メッセージ」の略で、隠し場所のオプションの説明を指定するために使用されます。それが必要ない場合は、-m welcome_cartパーツを省略できます。
svick

335

私は通常、隠したくない変更をインデックスに追加してから、--keep-indexオプションで隠します。

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

最後のステップはオプションですが、通常は必要です。インデックスから変更を削除します。


警告 コメントに記載されているように、これにより、ステージングされたものとされていないものの両方がすべて隠されます。--keep-index隠しが行われた後、言葉だけでインデックスを残します。これにより、後でスタッシュをポップするときにマージの競合が発生する可能性があります。


5
--patchオプションを使用してやりたくない変更がたくさんある場合、これは受け入れられた回答よりもはるかに優れています。
quux00 2012

181
いいえ、これにより、ステージングされたものとされていないものの両方がすべて隠されます。--keep-index隠しが行われた後、言葉だけでインデックスを残します。したがって、これは質問に対する有効な答えではありません、AFAICT。
ラマン

2
(代わりにunstaged変更により、変更を上演しスタッシュ)これの逆を行うの解決のためにレイチェルの質問@に私の答えを参照してください- stackoverflow.com/questions/3040833/...
JesusFreke

3
その後、追加したファイルをコミットせずに、隠しておいたファイルを取り戻したい場合は、を実行できますgit stash; git stash pop stash@{1}
yndolok 2013年

8
警告:@Ramanのポイントに注意してください。これは本来あるべきことをしません。これはスタッシュに同じ変更を置く作業ツリーでそれらを残します。後でスタッシュをポップしようとすると、マージの競合が発生する可能性が高く、それらは非常に混乱し、修正が難しいことがよくあります。
rjmunro 2014

26

svickの答えに追加するために、この-mオプションは単にメッセージを隠し場所に追加するだけで、完全にオプションです。したがって、コマンド

git stash push [paths you wish to stash]

完全に有効です。たとえば、src/ディレクトリ内の変更のみを隠したい場合は、実行するだけです。

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