web-dev-qa-db-ja.com

git-stashpop中にマージが競合した後のエラー

元のタイトル:git-変更されていないすべてのファイルを更新します

現在、変更されていないgitリポジトリ内のすべてのファイルを更新しようとしています。たとえば、私が持っているとしましょう:

  • test1.py
  • test2.py

test1.pyはローカルで変更されていますが、両方のファイルはリモートで変更されています。今私は試しました:

git stash
git pull
git stash pop

これにより変更が復元され、マージする必要があるという警告が表示されましたtest1.py。ここまでは順調ですね。同じプロセスを再度実行しようとすると(両方のファイルが再度リモートで変更された後)、問題が発生します。 Gitは今言います

unmerged (6b126638f7c63aa648609afa60ab972a2403502b)
fatal: git-write-tree: error building trees
Cannot save the current index state

ちょっと悲しいです。簡単なことだけが必要です。変更していないすべてのファイルを更新します。後でマージを処理します。

21
ftiaronsem

ファイルの競合を解決しましたが(脚注を参照)、Gitはあなたが完了したかどうかを知りません。その競合の解決が完了したことをgitに示す必要があります。 (それ以外の場合は、先に進むことができ、実際に解決していなかった場合は、足で自分を撃つためのあらゆる種類の方法を見つけることができます。)

私の知る限り、それを行う方法は次のとおりです。

git add <file>        # stage the resolved version, which marks it as resolved
git reset HEAD <file> # unstage the changes, leaving the resolution just in the work tree

update-indexを使用して両方を同時に実行する方法があるはずのようですが、簡単に見てみるとわかりません。 (ただし、実際のマージの競合については、コンテンツをステージングせずに競合を解決済みとしてマークすることは決してしたくありません。これが発生するのは隠し場所だけです。 )

そして、VonCが彼の回答で述べているように、これが再び発生した場合、git statusを使用してスタッシュを適用すると、マージの競合が発生したものを簡単に確認できます。それらは赤で表示され(色がオンになっている場合)、unmerged(または、削除/変更の競合の場合はdeleted by us/them)と表示されます。

脚注:あなたの質問を振り返ってみると、あなたが対立を修正したかどうかは実際にはわかりません。あなたは「これまでのところとても良い」と言っただけです。あなたが見た「警告」は、実際には紛争を即座に解決するための提案として意図されています。引っ張った変更と隠しておいた変更を組み合わせようとすると、競合が発生しました。何らかの方法で先に進む前に、その競合を解決し、作業ツリーを一貫した状態にする必要があります。マージの競合と同じように対処します。ファイルを調べ、競合マーカーを見つけ、保持するコンテンツを見つけます。 (そして、仕上げ方については上記を振り返ってください。)

27
Cascabel

これは、まだ解決されていないマージのために、2番目のスタッシュが機能しないことを意味するはずです。
これを参照してください SO質問 これは、隠し場所での同じエラーメッセージを示しています。

これ スレッドは確認します ツリーにマージされていないファイルを含めることはできません。

マージされていないエントリを持つツリーがあります。
問題を調べて解決してみませんか?
シンプルな "git status "は、マージされていないエントリが何であるかを示します。これらのファイルを簡単に見ると、競合マーカーが表示されます。

問題を解決し、コミットして、続行します。

2
VonC