105

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

ちょっとした話:

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

これはエラーです:

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

確かに私はまだgitのすべての概念を理解していません、彼らは私を少し混乱させます...多分私は何か間違ったことをしました。

誰かが私がこれを解決するのを手伝ってくれるなら素晴らしいでしょう...私は今1時間以上グーグルとすべてを検索してきました、そして私はまだ解決策に到達しませんでした。

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

4

12 に答える 12

82

スタッシュに追跡されていないファイルが含まれていて、後でリポジトリに追加されたようです。あなたがそれをチェックアウトしようとすると、それは既存のファイルを上書きするので、gitは正しく拒否します。

修正するには、そのファイルを削除し(問題なく、まだリポジトリにあります)、stashを適用してから、必要に応じて、ファイルの隠しバージョンをリポジトリ内バージョンに置き換えるなどの操作を行うことができます。

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

  1. 別の場所に移動します
  2. 隠し場所を適用する
  3. 2つのファイルバージョンを手動でマージします(作業ツリーと移動)。
于 2012-05-09T01:57:58.303 に答える
66

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

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

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

git stash drop

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

于 2012-05-10T20:00:04.887 に答える
62

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

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

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

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

git stash branch STASHBRANCH

「stash ブランチ」の操作

次に行うことは、stash とターゲット ブランチ (ここでは ORIGINALBRANCH と呼びます) の現在の位置との関係によって異なります。

オプション 1 - stash ブランチを通常どおりにリベースします (stash から多くの変更があります)。

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

オプション 2 - スタッシュに一致するように元のブランチをリセットします (スタッシュ以降の限定的な変更)

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

于 2013-01-29T00:35:46.057 に答える