139

以前に隠しておいた変更を適用しようとしていますがgit stash pop、次のメッセージが表示されます。

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

それに対処する方法について何か提案はありますか?

4

11 に答える 11

206

ダーティな作業コピーに隠し変更を適用する必要がある場合、たとえば、隠しから複数のチェンジセットをポップする場合は、次を使用します。

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

基本的にそれ

  1. パッチを作成します
  2. それをapplyコマンドにパイプします
  3. 競合がある場合は、3方向マージを介して解決する必要があります
  4. 適用(またはマージ)が成功すると、適用されたばかりのスタッシュアイテムが削除されます...

上記のワンライナーのように正確に動作する必要がある-f(強制)オプションがないのはなぜだろうか。git stash pop

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

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

-33方向マージを介して直接競合を解決できるパラメータを指摘してくれた@SamHaslerに感謝します。

于 2010-09-17T08:21:45.040 に答える
62

私はこのようにそれを行います:

git add -A
git stash apply

そして(オプションで):

git reset
于 2012-07-24T08:59:03.243 に答える
9

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

たとえばstash@{0}、汚れた木に適用したいとします。

  1. stash@{0}パッチとしてエクスポート:

    git stash show -p stash@{0} > Stash0.patch
    
  2. 変更を手動で適用します。

    git apply Stash0.patch
    

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

于 2010-03-30T22:44:18.563 に答える
8

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

$ gitstashsave「現在の変更の説明」
$ git stash pop stash @ {1}

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

于 2009-09-01T05:53:06.257 に答える
6

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

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

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

つまり、現在の変更をコミットします(これは決してプッシュしません)。ワークスペースがクリーンになったので、スタッシュをポップします。ここで、以前のコミットの修正として、スタッシュの変更をコミットします。これで、両方の変更セットが1つのコミット( "Fixme")に結合されました。「そのコミットの前に1つ」にチェックアウトするだけでgit reset(実際には何も失われ--softません)、これで両方の変更セットが完全にコミットされなくなります。--hard

編集

実際にはもっと簡単だと気づきました。手順3を完全にスキップできるので、...

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

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

于 2012-04-17T18:17:36.957 に答える
4

また、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の完了に伴う冗長性が気に入っています。)

于 2011-04-26T09:09:25.570 に答える
4

私が今日行ったように、このような状況に陥った場合、これらの答えは実際には機能しません。何git reset --hard回やったとしても、どこにも行きませんでした。私の答え(決して公式ではありませんでした):

  1. 隠し場所のハッシュの使用を把握するgit reflog --all
  2. そのハッシュを興味のあるブランチとマージします
于 2010-10-28T05:35:14.140 に答える
3

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

于 2012-01-20T19:33:58.977 に答える
2

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

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
于 2009-09-01T05:54:01.763 に答える
0

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

于 2012-01-16T15:19:11.787 に答える
0

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

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

于 2013-03-22T23:28:54.637 に答える