web-dev-qa-db-ja.com

git-両方のブランチによって追加された同じファイルが奇妙なマージの競合を引き起こす

現在、2つのブランチに取り組んでいます。ソフトウェアの更新のため、フォルダ構造を完全に変更する必要がありました。したがって、ファイルを両方のブランチに移動します。さて、作業ブランチをマスターブランチにマージするようになりました。

問題は、ファイルが1つのブランチ(added by themまたはadded by us)によってのみ追加されたことを通知するマージ競合があることです。問題は、ファイルがbothブランチによって追加されていることです。

たとえば、textures/texture1.pngにテクスチャがあります。 masterブランチはそれを正しい場所に移動しました(以前はmisc/textures/texture1.pngの前でした)。作業ブランチはそれをまったく同じ場所に移動し、後で編集しました。このファイルのマージの競合は次のように述べています。

    added by us: textures/texture1.png

重要なのは、これがnot必要なファイルであることです。他のブランチのファイルが欲しい!
私がする時

git checkout --theirs textures/texture1.png

私は得る

error: path 'textures/texture1.png' does not have their veresion

しかし、このファイルしますが存在します!最近追加しました!そして、それは私が欲しいファイルです

これらの競合を解決するにはどうすればよいですか?

(必要に応じて詳細情報!)

21
BrainStone
a--b--c--M--d--f--E--g--h--i  <<< master
    \
     \
      x--M'--y--z              <<< you

あなたの状況は上記のように見えますか(ここで、MとM 'は移動するコミットで、Eはテクスチャを編集するコミットです)。 z/iとgitをマージしようとすると、本当に満足できません。

あなたは一時的なブランチでMとM 'をマージしようとするかもしれません

a--b--c---M--d--f--E--g--h--i  <<< master
    \      \
     \      X                  <<< helper
      \    /
       x--M'--y--z             <<< you

ヘルパー( "X")をマスター( "z")およびマスター( "i")とマージします。

a--b--c---M--d--f--E--g--h--i     <<< master
    \      \                 \ 
     \      X-----XX---------XXX  <<< helper
      \    /      /
       x--M'--y--z                <<< you

こうすることで、競合は作成されてすぐに解決されます。紛争は時間とともに増大する傾向があるため、多くの場合、これはより簡単です。

8
mnagel

あなたはいつでも試すことができます

git mergetool

これによりGUIが開き、適切なリンクをクリックするだけで目的の変更を選択できます。手動で変更する必要がある場合があります。しかし、あなたのケースでは、ファイル画像を選択する必要があります。

14
maximus ツ

競合を解決するときは、git checkoutファイルを取得したい場所から正しいtree-ish(ブランチ名、タグ、コミットのsha1 ...)を示します。

git checkout theirBranchYouAreMerging -- textures/texture1.png

すべての「それら」の変更が必要ない場合は、部分的にキャンセルできます。そのためには、git reset -pインデックスから望ましくない変更を選択的に削除し、次にgit checkoutを作業ディレクトリからも削除するには:

git checkout theirBranch -- some/file.txt
git reset -p -- some/file.txt
git checkout -- some/file.txt
6
user2683246