回答:
stashされた変更をダーティ作業コピーに適用する必要がある場合、たとえばstashから複数の変更セットをポップする場合は、以下を使用します。
$ git stash show -p | git apply -3 && git stash drop
基本的には
上記のワンライナーのように正確に動作する-f
(強制)オプションがないのはなぜですか?git stash pop
当面は、この1行をgitエイリアスとして追加することをお勧めします。
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
-3
3ウェイマージを介して直接競合を解決できるようにするパラメーターを指摘してくれた@SamHaslerに感謝します。
git stash apply
は、ダーティな作業コピーがある場合、隠された変更を適用しません。したがってgit stash show -p | git apply
、ある種の強制スタッシュが適用されることがわかります。
error: <file> does not match index
修正されたすべてのファイルで失敗しました。ただし、別のソリューションが機能しました。
私はこのようにします:
git add -A
git stash apply
次に(オプション):
git reset
git add -u
、-A
追跡されていないファイルを追加しない点が異なります。
これは、必要なスタッシュをパッチファイルとしてエクスポートして手動で適用することにより、現在の変更をスタッシュすることなく実行できます。
たとえば、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「現在の変更の説明」 $ git stash pop stash @ {1}
これにより、現在の変更が隠され、スタッシュスタックから2番目のスタッシュがポップされます。
Mathiasのソリューションは、間違いなくgit stash pop --forceに最も近いものです(実際には、Git開発者の皆さん、このオプションをすでに入手しましょう!)
ただし、gitコマンドのみを使用して同じことをしたい場合は、次のことができます。
言い換えると、現在の変更をコミット(プッシュしない)します。ワークスペースがきれいになったので、隠しておいてください。ここで、以前のコミットの修正としてstashの変更をコミットします。これで、両方の変更セットが1つのコミット( "Fixme")に結合されました。チェックアウトをリセットして(--soft NOT --hardなので、実際には何も失われません)、チェックアウトを「1つ前のコミット」にリセットすると、両方の変更セットが完全にコミットされなくなります。
**編集* *
私はそれが実際にはさらに簡単であることを認識しました。ステップ3は完全にスキップできるので...
(現在の変更をコミットし、隠しておいた変更をポップし、その最初のコミットをリセットして、両方の変更セットをコミットされていない状態で結合します。)
私が今日したように、このような状況に陥った場合、これらの答えはどれも実際には機能しません。何回git reset --hard
やっても、どこにも行きませんでした。私の答え(決して公式ではなかった):
git reflog --all
また、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 add
変更をステージングして、ツリーをクリーンアップできます。次に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から:
stashされた変更を再び簡単にテストする方法が必要な場合は、git stashブランチを実行して新しいブランチを作成し、作業をstashしたときに行っていたコミットをチェックアウトして、そこに作業を再適用してから、正常に適用された場合は隠しておく
git stash show -p | git apply
違うgit stash apply
?