2013-07-14 11 views
15

私は現在、私が取り組んでいる2つのブランチを持っています。ソフトウェアの更新のために、私は完全にフォルダstructreを変更しなければなりませんでした。したがって、私は両方のブランチでファイルを移動します。今私は自分の作業ブランチを私のマスターブランチにマージしたいという要望に達しました。git - 両方のブランチで同じファイルを追加すると、奇妙なマージ競合が発生する

問題は、ファイルが1つのブランチ(added by themまたはadded by us)だけで追加されたことを示すマージの競合があることです。問題は、ファイルがで追加されており、両方ともブランチであることです。

たとえば、テクスチャはtextures/texture1.pngです。マスターブランチはちょうど正しい場所に移動しました(misc/textures/texture1.pngの前)。作業ブランチはそれを正確に同じ場所に移動し、後で編集しました。このファイルのマージ競合は言う:

added by us: textures/texture1.png 

点は、これは私が望んないファイルであるということです!私は他のブランチからのファイルが欲しい!
私は

git checkout --theirs textures/texture1.png 

は私が

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

取得んが、このファイルが存在しない場合は!私は最近それを追加しました!そしてそれが私が望むファイルです

どのようにこれらの競合を解決しますか?

(詳細は、必要に応じて!)

+0

サイドノートを:gitのは非常にあなたの両方がファイルを名前を変更することを伝えることはできませんgitは動的な名前の変更を検出するため、ファイルを編集しましたが、ここではそれほど問題はありません。私は "リネームファイル"のコミットと "リネームされたファイルの変更"を分け合わせることを実験していませんでしたが、それらを別々にすることは、gitがそれを "把握する"チャンスを増やすと信じています。それは特に、 "ヘルパーブランチ"テクニック@mnagelで説明されています。 – torek

答えて

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

(MおよびM」コミットが移動し、Eされているが、テクスチャを編集し、そのコミットである場合)あなたの状況はやや上記のように見えるのでしょうか?あなたはz/iをマージしようとし、gitは本当に幸せではありません。

ます( "I")は、あなたとヘルパー( "X")( "Z")とマスターを一時的なブランチ

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

に「MとMをマージして、マージしようとします。

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

このようにして競合は作成され、運ばれてから直接解決されます。コンフリクトが時間とともに増大する傾向があるため、これはしばしばより簡単です。

+0

ポイントはEがブランチ "you"です。しかし、私はこれを試みます。そしてあなたの方法で私はマスターにXXXをマージしますか?それが最終的なマージをしたい場所ですから。 – BrainStone

+1

枝Eが本当に重要ではありません。重要なことは、マージを早期に行い、そのような方法で簡単に競合を解決することです(実際には動作しないという保証はありません)。 3番目のグラフに示されているような状態になっている場合、XXXはiの後継なので、競合することなくマスターをヘルパー/ XXXに早送りすることができます。 – mnagel

+0

これは私のために働いた! noobを助けてくれてありがとう。 GitHubのネットワーク履歴は面白く見えますが、それは大丈夫です;) – BrainStone

9

あなたはいつも、これはあなただけの適切なリンクをクリックして、必要な変更を選択することができるGUIを開きます

git mergetool 

を試すことができます。場合によっては手動で変更する必要があります。しかし、あなたの場合は、ファイルイメージを選択するだけです。

+0

これは助けにはならない。それはちょうど私に同じことを教えてくれるからです(その1つのブランチはファイルを削除しましたが、**ではありませんでした!) – BrainStone

2

解決競合はちょうどあなたがファイルを取得する場所から右ツリーっぽい(支店名、タグ、コミットのSHA1を...)を示すgit checkoutを使用していますが:

git checkout theirBranchYouAreMerging -- textures/texture1.png 

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

git checkout theirBranch -- some/file.txt 
git reset -p -- some/file.txt 
git checkout -- some/file.txt 
関連する問題