以前に隠しておいた変更を適用しようとしていますがgit stash pop
、次のメッセージが表示されます。
Cannot apply to a dirty working tree, please stage your changes
それに対処する方法について何か提案はありますか?
ダーティな作業コピーに隠し変更を適用する必要がある場合、たとえば、隠しから複数のチェンジセットをポップする場合は、次を使用します。
$ git stash show -p | git apply -3 && git stash drop
基本的にそれ
上記のワンライナーのように正確に動作する必要がある-f
(強制)オプションがないのはなぜだろうか。git stash pop
それまでの間、このワンライナーをgitエイリアスとして追加することをお勧めします。
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
-3
3方向マージを介して直接競合を解決できるパラメータを指摘してくれた@SamHaslerに感謝します。
私はこのようにそれを行います:
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を使用して作業ディレクトリをクリーンアップするか、変更をコミットするか、現在の変更を隠したい場合は、次のことを試してください。
$ gitstashsave「現在の変更の説明」 $ git stash pop stash @ {1}
これにより、現在の変更が隠され、隠しスタックから2番目の隠しがポップされます。
git stash pop --force
Mathiasのソリューションは間違いなく(そして実際には、Git開発者の皆さん、このオプションをすでに取得しましょう!)に最も近いものです。
ただし、Gitコマンドのみを使用して同じことを実行したい場合は、次のことができます。
git commit -a -m "Fixme"
git stash pop
git commit -a --amend
git reset HEAD~
つまり、現在の変更をコミットします(これは決してプッシュしません)。ワークスペースがクリーンになったので、スタッシュをポップします。ここで、以前のコミットの修正として、スタッシュの変更をコミットします。これで、両方の変更セットが1つのコミット( "Fixme")に結合されました。「そのコミットの前に1つ」にチェックアウトするだけでgit reset
(実際には何も失われ--soft
ません)、これで両方の変更セットが完全にコミットされなくなります。--hard
編集
実際にはもっと簡単だと気づきました。手順3を完全にスキップできるので、...
git commit -a -m "Fixme"
git stash pop
git reset HEAD~
(現在の変更をコミットし、隠された変更をポップオフし、最初のコミットをリセットして、両方の変更セットをコミットされていない状態で結合します。)
また、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
回やったとしても、どこにも行きませんでした。私の答え(決して公式ではありませんでした):
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
私は同じ問題を抱えていましたが、gitには変更されたファイルがありませんでした。横になっていたindex.lockファイルがあったことがわかりました。それを削除すると問題は解決しました。
これらのほとんどを機能させることができませんでした。何らかの理由で、ファイルにローカルな変更があると常に考えています。スタッシュを適用できず、パッチが適用されずcheckout
、reset --hard
失敗します。最終的に機能したのは、スタッシュをでブランチとして保存しgit stash branch tempbranchname
てから、通常のブランチマージを実行することでした:git checkout master
とgit merge tempbranchname
。http://git-scm.com/book/en/Git-Tools-Stashingから:
隠された変更を再度テストする簡単な方法が必要な場合は、git stashブランチを実行できます。これにより、新しいブランチが作成され、作業を隠したときに行っていたコミットがチェックされ、そこで作業が再適用されてから、正常に適用された場合は隠します