git stash pop
で以前に隠した変更を適用して、メッセージを取得しようとしています。
Cannot apply to a dirty working tree, please stage your changes
それに対処する方法に関する提案はありますか?
汚れた作業コピーに隠された変更を適用する必要があるときstashから複数のチェンジセットをポップするには、次を使用します。
$ git stash show -p | git apply -3 && git stash drop
基本的には
-f
にgit 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者間マージを介して直接競合を解決できます。
私は次のようにします:
git add -A
git stash apply
次に(オプション):
git reset
目的のスタッシュをパッチファイルとしてエクスポートし、手動で適用することにより、現在の変更をスタッシュすることなくこれを行うことができます。
たとえば、stash @ {0}をダーティツリーに適用するとします。
Stash @ {0}をパッチとしてエクスポートします。
git stash show -p stash @ {0}> Stash0.patch
変更を手動で適用します。
git apply Stash0.patch
2番目の手順が失敗した場合、Stash0.patchファイルを編集してエラーを修正し、git applyを再試行する必要があります。
作業ディレクトリをgit resetでクリーンアップするか、変更をコミットするか、現在の変更を隠したい場合は、次を試してください:
$ git stash save "description of current changes" $ git stash pop stash @ {1}
これにより、現在の変更がスタッシュされ、スタッシュスタックから2番目のスタッシュがポップされます。
Mathiasのソリューションは、間違いなくgit stash pop --forceに最も近いものです(実際、Git開発者の皆さん、このオプションを既に入手しましょう!)
ただし、gitコマンドのみを使用して同じことを実行する場合は、次のことができます。
言い換えると、現在の変更をコミットします(プッシュすることはありません)。ワークスペースがきれいになったので、スタッシュをポップします。ここで、以前のコミットの修正としてstashの変更をコミットします。これで、両方の変更セットが1つのコミット(「Fixme」)に結合されました。チェックアウトを「その前に1つ」にリセットするだけで(実際には何も失われないので、ソフトではありません)、今は完全にコミットされていない両方の変更セットがあります。
** EDIT **
実はもっと簡単だと実感しました。手順3を完全にスキップできます。
(現在の変更をコミットし、隠された変更をポップオフし、その最初のコミットをリセットして、両方の変更セットをコミットされていない状態にします。)
また、 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の完了に伴う冗長性が好きです。)
今日私がやったように、あなたがこの状況に自分自身を見つけた場合、これらの答えのどれも実際には機能しません。 git reset --hard
's私がやった、どこにも行かなかった。私の答えは(公式ではありませんでした):
git reflog --all
git add
を実行して行った変更をステージングし、ツリーをクリーンアップすることにより、「ダーティ」ツリーにスタッシュを適用できます。その後、git stash pop
を実行して、隠された変更を適用できます。問題ありません。
変更されたがコミットされていないファイルがあります。どちらか:
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
これらのほとんどを機能させることができませんでした。何らかの理由で、ファイルにローカルな変更があると常に考えています。 stashを適用できません。パッチは適用されません。checkout
とreset --hard
は失敗します。最終的に機能したのは、git stash branch tempbranchname
を使用してスタッシュをブランチとして保存し、次に通常のブランチマージを実行することでした:git checkout master
とgit merge tempbranchname
。 http://git-scm.com/book/en/Git-Tools-Stashing から:
隠された変更を再度簡単にテストする方法が必要な場合は、git stashブランチを実行して、新しいブランチを作成し、作業を隠したときに行っていたコミットをチェックアウトし、そこに作業を再適用してからドロップします正常に適用される場合は隠します
私も同じ問題を抱えていましたが、gitには変更されたファイルがありませんでした。横になっていたindex.lockファイルがあったことがわかりました。削除することで問題は解決しました。