web-dev-qa-db-ja.com

git stashからファイルを削除

たくさんのファイルが入った隠し場所があります。

しかし、ファイルが競合しているため、スタッシュを適用できません。隠し場所で問題のあるファイルを特定したので、それを削除します。

すべてを破壊せずに、スタッシュから単一のファイルを削除するにはどうすればよいですか?

30
Houseman

スタッシュはコミット(または実際には2回、場合によっては3回のコミット)であり、コミットを変更することはできません。あなたの質問に対する文字通りの答えは、「できない」です。幸いなことに、あなたはneedをしません。

ファイルが競合しているため、スタッシュを適用できないと言います。しかし、あなたはcanを適用すると、単にマージの競合が発生します。必要なのは、マージの競合を解決することだけです。

競合がファイルREADME.txtにあるとしましょう。ちょうどここに何か書いておくことがあります。

ブランチ上バージョンを保持して解決する場合は、スタッシュを適用し、ブランチ上バージョンをチェックアウトして競合を解決します。

git stash apply
git checkout --ours -- README.txt  # or git checkout HEAD -- README.txt

インスタッシュバージョンを保持する場合は、そのバージョンを抽出します。

git checkout --theirs -- README.txt # or git checkout stash -- README.txt

または、古いマージ解決ツールを使用して(テキストエディターを使用します)、結果を "git add"します。

スタッシュがすべて完了すると、git stash dropはスタッシュを構成するコミットを「忘れ」ます。 (これが完了したと確信するまで、これを行わないでください。後で戻すのは非常に困難です。)

24
torek

この状況には回避策があります。

  1. stashをパッチファイルとして保存します。

    $ git stash show -p > stash.patch
    
  2. 競合をスキップして、このパッチを適用します(競合の解決を求められます。欠落しているファイルをスキップするだけです)。

    $ patch -p1 < stash.patch
    

stash.patchを後でクリーンアップすることを忘れないでください!

12
Dmytro Sirenko
  1. コミットされていない変更を隠します。
  2. 元のスタッシュを適用する
  3. ファイルを破棄する
  4. 4コミットされていない変更を含むスタッシュを適用します。
2

ローカルコードベースから必要なファイルを削除し、それをプッシュして隠します。変更が反映され、ファイルがstashから削除されます。

0
viper03