web-dev-qa-db-ja.com

Git stash:「ダーティワーキングツリーには適用できません。変更をステージングしてください」

git stash popで以前に隠した変更を適用して、メッセージを取得しようとしています。

Cannot apply to a dirty working tree, please stage your changes

それに対処する方法に関する提案はありますか?

131
avernet

汚れた作業コピーに隠された変更を適用する必要があるときstashから複数のチェンジセットをポップするには、次を使用します。

$ git stash show -p | git apply -3 && git stash drop

基本的には

  1. パッチを作成します
  2. applyコマンドへのパイプ
  3. 競合がある場合は、3者間マージで解決する必要があります
  4. 適用(またはマージ)が成功した場合、適用されたばかりの隠しアイテムをドロップします...

-fgit stash pop(force)オプションがなく、上記の1ライナーとまったく同じように動作する必要があるのはなぜだろうか。

それまでの間、このワンライナーをgitエイリアスとして追加することをお勧めします。

$ git config --global --replace-all alias.unstash \
   '!git stash show -p | git apply -3 && git stash drop'
$ git unstash

@SamHaslerに-3パラメーターを指定していただき、ありがとうございます。これにより、3者間マージを介して直接競合を解決できます。

192
muhqu

私は次のようにします:

git add -A
git stash apply

次に(オプション):

git reset
57
Sergii Mostovyi

目的のスタッシュをパッチファイルとしてエクスポートし、手動で適用することにより、現在の変更をスタッシュすることなくこれを行うことができます。

たとえば、stash @ {0}をダーティツリーに適用するとします。

  1. Stash @ {0}をパッチとしてエクスポートします。

    git stash show -p stash @ {0}> Stash0.patch

  2. 変更を手動で適用します。

    git apply Stash0.patch

2番目の手順が失敗した場合、Stash0.patchファイルを編集してエラーを修正し、git applyを再試行する必要があります。

9
Ishan

作業ディレクトリをgit resetでクリーンアップするか、変更をコミットするか、現在の変更を隠したい場合は、次を試してください:

 $ git stash save "description of current changes" 
 $ git stash pop stash @ {1} 

これにより、現在の変更がスタッシュされ、スタッシュスタックから2番目のスタッシュがポップされます。

8
William Pursell

Mathiasのソリューションは、間違いなくgit stash pop --forceに最も近いものです(実際、Git開発者の皆さん、このオプションを既に入手しましょう!)

ただし、gitコマンドのみを使用して同じことを実行する場合は、次のことができます。

  1. git commit -a -m "Fixme"
  2. git stash pop
  3. git commit -a --amend
  4. git reset HEAD〜

言い換えると、現在の変更をコミットします(プッシュすることはありません)。ワークスペースがきれいになったので、スタッシュをポップします。ここで、以前のコミットの修正としてstashの変更をコミットします。これで、両方の変更セットが1つのコミット(「Fixme」)に結合されました。チェックアウトを「その前に1つ」にリセットするだけで(実際には何も失われないので、ソフトではありません)、今は完全にコミットされていない両方の変更セットがあります。

**​​ EDIT **

実はもっと簡単だと実感しました。手順3を完全にスキップできます。

  1. git commit -a -m "Fixme"
  2. git stash pop
  3. git reset HEAD〜

(現在の変更をコミットし、隠された変更をポップオフし、その最初のコミットをリセットして、両方の変更セットをコミットされていない状態にします。)

6
machineghost

また、 Mathias Leppichのソリューション がうまく機能することがわかったので、グローバルな.gitconfigにエイリアスを追加しました

[alias]
        apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop

今、私はちょうど入力することができます

git apply-stash-to-dirty-working-tree

それは私にとって素晴らしいことです。

(あなたの走行距離は、この長いエイリアス名によって異なる場合があります。しかし、bashの完了に伴う冗長性が好きです。)

4
mat

今日私がやったように、あなたがこの状況に自分自身を見つけた場合、これらの答えのどれも実際には機能しません。 git reset --hard 's私がやった、どこにも行かなかった。私の答えは(公式ではありませんでした):

  1. Stashのハッシュの使用法を理解するgit reflog --all
  2. そのハッシュを興味のあるブランチとマージします
4
Dan Rosenstark

git addを実行して行った変更をステージングし、ツリーをクリーンアップすることにより、「ダーティ」ツリーにスタッシュを適用できます。その後、git stash popを実行して、隠された変更を適用できます。問題ありません。

3

変更されたがコミットされていないファイルがあります。どちらか:

git reset --hard HEAD (to bring everything back to HEAD)

または、変更を保存する場合:

git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
2
brool

これらのほとんどを機能させることができませんでした。何らかの理由で、ファイルにローカルな変更があると常に考えています。 stashを適用できません。パッチは適用されません。checkoutreset --hardは失敗します。最終的に機能したのは、git stash branch tempbranchnameを使用してスタッシュをブランチとして保存し、次に通常のブランチマージを実行することでした:git checkout mastergit merge tempbranchnamehttp://git-scm.com/book/en/Git-Tools-Stashing から:

隠された変更を再度簡単にテストする方法が必要な場合は、git stashブランチを実行して、新しいブランチを作成し、作業を隠したときに行っていたコミットをチェックアウトし、そこに作業を再適用してからドロップします正常に適用される場合は隠します

0
rwilson04

私も同じ問題を抱えていましたが、gitには変更されたファイルがありませんでした。横になっていたindex.lockファイルがあったことがわかりました。削除することで問題は解決しました。

0
boxed