8

.emacs ディレクトリを読み込んでいたところ、次の競合が発生しました。

CONFLICT (add/add): Merge conflict in elisp/dired-details+.el

Git の状態は次のとおりです。

 Unmerged paths:
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #  both added:         elisp/dired-details+.el

さて、git は を使用することを提案しgit rmました。ローカル ファイルをプルしているファイルに完全に置き換えたいので、ちょっと賢明なようです...だから私はそうgit rm elisp/dired-details+.elgit mergeます. 私は得る:

git merge: fatal: マージが完了していません (MERGE_HEAD が存在します)。マージする前に変更をコミットしてください。

わかりましたgit commit -a -m "ugh merge conflicts"git pull origin master.

これで、 I am missing を除いて、すべてが正常にマージされましたdired-details+.el。ちょっと混乱しています。次の答えを知りたいです。

  1. git-rmリモートブランチからそのファイルを元に戻して取得するにはどうすればよいですか?..
  2. そもそもなぜ衝突があったのですか?..ここで何が起こっているのadd/addですか?..
  3. git-rm置き換えたいファイルを 'ing する代わりに、どうすればよいでしょうか?..
4

1 に答える 1

9

まず、 を使用してマージ コミットを元に戻しますgit reset --hard HEAD^。これにより、最後のコミットが消去され、作業コピーが以前のコミットの状態にリセットされることに注意してください。実行する前に、これが何をするかをよく理解してください。gitkこれを視覚化するのに役立ちます。

第二に、git rmここで期待したことをしません。マージの競合がある場合は、競合を解決するための競合マーカーを含むファイルを使用して、半マージ状態のファイルを見ています。この時点で、作業コピーを最終的なマージ コミットの状態に修正するよう求められます。ファイルを削除することで、ファイルをこれ以上存在させたくないことを git に伝えましたが、これは望んでいたことではありません。

この段階で行う必要があるのは、作業コピー内の競合するファイルを保持したいバージョンに更新することです。通常、これは競合マーカーを調べて、それに応じてファイルを調整することによって行われます。あなたの場合、マージ元のブランチからのコピーが必要であることが確実にわかっている場合は、git show :3:elisp/dired-details+.el > elisp/dired-details+.elこれを行うために使用できます。次にgit add elisp/dired-details+.el、そのファイルの競合を解決したことを git に伝えてgit commitから終了します。

ここでgit show :3:...は、MERGE_HEAD からファイルのバージョンを要求しています。別のバージョンが必要な場合は1、共通の祖先または2マージの「自分の」側にも使用できます。

于 2011-01-06T10:46:19.220 に答える