1つのファイルだけを隠しておく


174

単一のファイルからの変更だけを隠せるようにしたいのですが。

git stash save -- just_my_file.txt

上記は動作しません。代替案はありますか?



以下のために、単一のファイルの代わりに、ジャグリング隠しコマンド、はるかに簡単なアプローチは、コピーすることである単一のファイルをし、あなたに戻ってそれを持って帰りたいと思うとき、単純に元の上にコピーします。例えば。cp just_my_file.txt just_my_file.txt.manualstash これで、すべてのチェックアウトなどを実行でき、コピーは「追跡されていないファイル」なので、ブランチ間を移動して問題なくコミットできます。「単一のファイルをマージ」したい適切なブランチ/コミットにいるときはmv just_my_file.txt.manualstash just_my_file.txt、そうするだけで変更を確認し、必要に応じてコミットできます
Dimitry K

回答:


173

おもう stash -pはおそらくあなたが望む選択が、将来他のさらにトリッキーなことに遭遇した場合に備えて、次のことを覚えておいてください:

Stashほんの少しだけ複雑なbranchセットの非常に単純な代替手段です。Stashは物事をすばやく移動するのに非常に便利ですが、ブランチを使用すると、それほど面倒で作業することなく、より複雑なことを実現できます。

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

行ってやりたいことをしてから、後で簡単にrebaseそして/またはmergetmpbranchを実行します。stashが許可するよりも注意深く追跡する必要がある場合それは実際にはそれほど多くの余分な作業ではありません。


2
利点として、大きな苦痛なしにスタッシュを本物のブランチに変えることができます。
Wes Hardaker 2013年

87

隠された変更を含むメッセージを指定したくない場合は、二重ダッシュの後にファイル名を渡します。

$ git stash -- filename.ext

追跡されていない/新しいファイルの場合は、最初にステージングする必要があります。

ただし、メッセージを指定する場合、を使用してくださいpush

git stash push -m "describe changes to filename.ext" filename.ext

どちらの方法もgitバージョン2.13以降で機能します


1
変更を改正する際、この答えは、ほとんどまっすぐ進む私には思える: git stash -- filename.extgit commit --amendgit stash pop
ブランドンデューイ

1
これは非常に新しい機能に依存しているに違いないと思います。git 2.1.4では動作しません。
Richard Smith

stashは保存されますが、同じファイルが同時にステージングに追加されます(git v2.20.1)
パラドロイド

58

と対話的に単一行を隠しておくことができますgit stash -pgit add -p)ます。

ファイル名は必要ありませんが、d隠しておきたいファイルに到達するまで他のファイルをスキップし、そこにあるすべての変更を隠しますa


3
隠したくないファイルがたくさんある場合、これには長い時間がかかります。
jjj 2017年

23
これがいつ変更されたかはわかりませんが、git 2.14.1git stash -p <filename>
muon

21

最良のオプションは、このファイル以外のすべてgit stash save --keep-indexをステージングし、stashにインデックスを保持するように指示して、ステージングされていないファイルをスタッシュすることです。

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Danが指摘するように、thefiletostashstashによってリセットされるのはだけですが、他のファイルもstashするため、希望どおりではありません。


2
これにより、インデックスは同じ状態に保たれますが、インデックス内のファイルも隠されませんか?つまり、これを実行した後にインデックスを現在のブランチにコミットし、別のブランチに切り替えてgit stash pop実行すると、隠しておく1つのファイルだけでなく、すべてのファイルが適用されますか?
Dan Molding

@DanMoulding:あなたは完全に正しいです、私はこれについて考えていません。
CharlesB 2012

16

「git stash」を使用するたびに「変更を破棄する」ことを実際に意味する場合に備えて(そして実際にgit stashを使用して一時的に保管しないでください)、その場合は

git checkout -- <file>

git stashは、ブランチを作成したり、何かを実行したりするための、より迅速で単純な代替手段であることに注意してください。


単一のファイルに加えた変更をすべて削除したい場合は、これが最良の答えだと思います。
Mohamed Haseel

そして、私はこれがその特定のタスクのための最良の答えだと思います
ザキールフセイン2018年

6
質問は十分に明確で、変更を1つのファイルに戻す方法を尋ねていませんでした。反対投票。
Richard Smith

これは良い答えであり、代替案として明確に示しています。しかし、一部の人々は、乱暴な機能として反対投票を使用するのに十分頑固になります:+1
Mukul Jain

@MukulJain実際にstash-per-fileを非常に一時的な方法で使用する必要がありました(基本的に、同じ行に影響を与えた2つのコミットの変更を1つのファイルで分離します)。私は実際には反対票を投じないで、それが私にとって役に立たないことを述べてください。
Paul Stelian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.