web-dev-qa-db-ja.com

stashを作業ディレクトリに適用できないのはなぜですか?

Stashを作業ディレクトリに戻すことはできません。

小さな物語:

最初にコミットされた変更をプッシュしようとしましたが、「いいえ、最初にプルできません」と言っていました... OKプルしようとすると、上書きされる変更があり、変更を隠しておく必要があると言われました。 OK、変更を隠して...プルし、コミットされた変更をプッシュしました。しかし、今は、作業していたコミットされていない変更を復元できません。

これはエラーです:

MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash

確かにgitのすべての概念をまだ理解していないので、少し混乱させられます...何か間違ったことをしたかもしれません。

誰かがこれを解決するのを手伝ってくれたらいいなと思います...私はグーグルとすべてのものを今から1時間以上探していましたが、まだ解決策には至りませんでした。

ヘルプは大歓迎です。ありがとう!

87
Miguel Angelo

スタッシュに追跡されていないファイルが含まれていて、その後リポジトリに追加されたようです。試してみると、gitは既存のファイルを上書きするため、当然拒否します。

修正するには、そのファイルを削除する(大丈夫、まだリポジトリにある)ようにして、スタッシュを適用し、必要に応じてファイルのスタッシュバージョンをレポ内のバージョンに置き換えます。

編集:ファイルが作業ツリーでのみ作成されている可能性もありますレポジトリに追加されていないこの場合、ローカルファイルを単に削除しないでください。

  1. 別の場所に移動する
  2. 隠し場所を適用する
  3. 2つのファイルバージョン(作業ツリーと移動済み)を手動でマージします。
72
blahdiblah

最も安全で簡単な方法は、おそらく再び物事を隠蔽することです。

git stash -u             # This will stash everything, including unstaged files
git stash pop stash@{1}  # This will apply your original stash

その後、結果に満足している場合は、電話することができます

git stash drop

「安全な」隠し場所を削除します。

55
Koraktor

@blahdiblahで述べたように、問題のあるファイルを手動で削除し、ブランチを切り替えてから、手動で追加し直すことができます。しかし、個人的には「git内」に留まることを好みます。

これを行う最善の方法は、スタッシュをブランチに変換することです。ブランチになったら、通常のブランチ関連のテクニック/ツールを使用してgitで通常どおり作業できます。これは、リストされたエラーがない場合でも、スタッシュを操作するための実際の便利な一般的な手法です。 stashは実際には隠れたコミットであるため、うまくいきます(PSを参照)。

スタッシュをブランチに変換する

以下は、スタッシュが作成されたときにHEADに基づいてブランチを作成し、スタッシュを適用します(コミットしません)。

git stash branch STASHBRANCH

「stashブランチ」での作業

次に何をするかは、スタッシュと、ターゲットブランチ(ORIGINALBRANCHと呼ぶ)の現在の関係に依存します。

オプション1-stashブランチを通常どおりリベースします(stash以降の多くの変更)

ORIGINALBRANCHで多くの変更を行った場合は、おそらくローカルブランチと同様にSTASHBRANCHを扱うのが最適です。 STASHBRANCHで変更をコミットし、ORIGINALBRANCHでリベースし、ORIGINALBRANCHに切り替えて、STASHBRANCHの変更をリベース/マージします。競合がある場合は、それらを通常どおり処理します(このアプローチの利点の1つは、競合を確認して解決できることです)。

オプション2-stashに一致するように元のブランチをリセットします(stash以降の制限された変更)

ステージングされた変更を保持したままスタッシュしてコミットした場合、スタッシュしたときにステージングされていない追加の変更を取得するだけで、次のことができます。作業コピーを変更せずに元のブランチとインデックスに戻ります。最終結果は、作業コピーでの追加のスタッシュ変更です。

git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset

バックグラウンド

スタッシュはブランチ/タグのようなコミットです(パッチではありません)

PS、コミットとしてパッチと考えるのと同じように、スタッシュをパッチと考えるのは魅力的ですが、スタッシュは実際にはHEADに対するコミットです適用/ポップするときは、現在のブランチにチェリーピッキングするのと同じようなことをしています。ブランチとタグは実際には単なるコミットへの参照であるため、多くの点でスタッシュ、ブランチ、タグはまったく異なります。コミット(およびその履歴)を指す方法。

作業ディレクトリを変更していない場合でも必要になる場合があります

PPS、-patchや--include-untrackedでstashを使用した後にこのテクニックが必要になる場合があります。作業ディレクトリを変更しなくても、これらのオプションを使用すると、単に適用できないスタッシュが作成されることがあります。理由を完全に理解していないことを認めなければなりません。 http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html を参照してください。

52
studgeek

解決策:問題のファイルを削除してから、ポップ/適用を再度スタッシュしてみてください。他のファイルは削除しないでください。エラーで言及されたファイルだけを削除してください。

問題:Gitは時々吸います。 git stash -u追跡されていないファイルは含まれていますが(クール!)、それはしない追跡されていないファイルを削除し、しない残り物の上に隠された追跡されていないファイルを適用する方法を知っていますクール!)、これは本当に-uオプションはほとんど役に立ちません。

39
qwertzguy

代わりにstashのコードの違いをパッチとして適用するには、次のコマンドを使用します。

git stash show --patch | patch -p1
23
ciphersimian

私の同様にブロックされたポップ操作は、残りのignored files(.gitignoreファイルを参照)のためでした。 Gitステータスは追跡されたものと追跡されていないものを示しましたが、私の活動は無視されたファイルをクリーンアップしませんでした。

詳細:使用したgit stash save -a、マスターをチェックアウトしてコンパイルし、元の動作を確認してから、すべてを元に戻して編集を継続しようとしました。ブランチをチェックアウトしてポップしようとしたとき、無視されたファイルはstashが保存される前から残っていました。これは、マスターのチェックアウトがコミットされたファイルにのみ影響したためです。無視されたファイルは消去されませんでした。そのため、ポップは失敗しました。本質的に、隠されている無視されたファイルをまだ残っているファイルの上に復元したくないと言っていました。残念ながら、それらとのマージセッションを開始する方法がわかりませんでした。

最終的に、git clean -f -d -x無視されたファイルを削除します。興味深いことに、私の〜30個のうち、4つのファイルがクリーニング後に残っています(サブディレクトリに埋め込まれています)。どのカテゴリに属しているか、手動で削除する必要があることを把握する必要があります。

それから私のポップは成功しました。

0
deasserted

これを試して:

git checkout stash-。

0

これは何度も起こりました。追跡されていないファイルをgit stash -uで隠してしまい、最終的にリポジトリに追加されてしまい、隠された変更を適用できなくなります。

git stash pop/applyでファイルを強制的に置き換える方法が見つからなかったため、まず、隠されていた追跡されていないファイルのローカルコピーを削除します(コミットされていない変更)そして、隠された変更を適用します。

rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

最後に、git statusgit diffおよびその他のツールを使用して、欠落しているファイルがある場合、削除されたファイルの一部をチェックして追加します。


保持したいコミットされていない変更がある場合は、最初に一時的なコミットを作成できます。

git add --all
git commit -m "dummy"
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

自分に合ったツールを使用して、以前にコミットした変更をローカルファイルにマージし、ダミーコミットを削除します。

git reset HEAD~1
0
Helder Pereira