2012-02-03 13 views
34

git-mergeアルゴリズムをgitリポジトリの2つの任意のファイルで利用したいと思います。ここに私の作業ディレクトリは次のとおりです。git mergeアルゴリズムを2つの個別のファイルに実行する

folder/ 
    file1 
    file2 

ファイルfile1とfile2は似ていますが、私は、彼らが同じファイルの異なるバージョンであるかのようにgitがそれらをマージする方法を見てみたいです。言い換えれば、私はこのようなものが欲しい:

git merge-files file1 file2 > merge_of_file1_file2 

これを行う方法はありますか?

答えて

43

あなたは共通の祖先を提供していないので、これは実際には意味がありません。しかし、もしあなたが持っていれば、あなたは以下を使うことができます:

git merge-file <current-version> <common-ancestor> <other-version> 

これは結果を現在のバージョンファイルに置きます。あなたが別の場所にしたい場合は、以下を使用します。

git merge-file -p <current> <common> <other> > <dest> 

それはへの相対的な変化を検討するために何かを提供するために、共通の祖先を必要とします。リポジトリの履歴から空のファイルまたは古いバージョンのコピーを提供することでハッキングすることができますが、結果の品質は2つの差分をマージするので、共通の祖先をどれだけうまく選択するかによって異なります、それと新しいバージョンのそれぞれとの間。空のファイルは、2つが非常に(少なくとも3つの同一の行が多い)の場合にのみうまく動作します。それがなければ

、あなたが本当に行うことができ、すべての違いを見ている:

git diff --no-index file1 file2 
+2

いずれかのファイルのコピーを共通の祖先として使用するとどうなりますか? –

+1

@CarlG、file2にfile1よりももう一つの行が含まれているとしましょう。ファイル1を祖先として選択すると、この行は追加として解釈され、マージはファイル2になります。ファイル2をアンカーとして選択すると、その行は削除として解釈され、結果としてfile1が取得されます。 –

+2

@CarlG別の言い方をすると、Aで始まって片方がBに変わってもう一方がAに変わると、マージされた結果は明らかにBです。 – Cascabel

29

何をしようとする場合:

touch file3 #empty 
git merge-file file1 file3 file2 

これは、ファイル1の3ウェイマージを行いますfile3(空のファイル)をfile2とします。

これはfile1に書き込むことに注意してください。

touch file3 
cp file1 merge_of_file1_file2 
git merge-file merge_of_file1_file2 file3 file2 
+1

これは(Git Bash経由で)動作することを確認しました。ここで私は、単一のコマンドにこれをカプセル化するために書いたbashの関数です: '' ' 機能のマージは、(){ \tタッチ__merge_result__ \t Gitのマージファイル$ 1 __merge_result__ $ 2 \t RM __merge_result__ } ' '' –

関連する問題