次のシナリオがあります: 1 つのブランチでいくつかのコミットを行い、新しいブランチで UML モデルからコードを生成するツールを使用しました。残念ながら、このツールはやや機能が悪く、ラウンドトリップ生成を適切にサポートしていません。したがって、私のコードはすべて削除され、生成されたスケルトンのみが保持されました。
これらの 2 つのブランチを、両方のバージョンのファイルのすべての行を保持して (理想的には、各ファイルで mergetool をトリガーして) マージしたいと考えています。
私がこれまでにやったこと:
作業ツリーのルートにシェル スクリプトを作成しました。
#!/bin/sh
echo "union merge"
git merge-file --union "${1}" "${2}" "${3}"
exit 1 # trigger merge conflict
.gitattributes ファイルを作成しました:
**.cpp merge=mytool
**.h merge=mytool
そして私の.gitconfigを編集しました:
[merge "mytool"]
name = union merge
driver = ./union-merge.sh %A %O %B
.gitattributes ファイルが実際にすべてのファイルのマージ属性を設定していることを確認できます。
$ git check-attr -a src/file.cpp customn/appopt.cpp: マージ: mytool
ただし、スクリプトは実行されていません (確認のためにエコーを追加しました)。代わりに、通常の git マージが実行され、他のブランチの内容が残ります。どうすればこれを適切に行うことができますか?
編集.: いくつかの詳細情報:
これが歴史です
A --- B ------- D (マスター) \ / ---C--- (ツールブランチ)
Bで、変更をコミットしました。そこから新しいブランチを作成し、上記のコード ジェネレーターを使用してメソッド スケルトン (および必要ないくつかのマーカー コメントを使用) を生成しました。以前のモデルはAに基づいていたため、このステップでBの変更が削除され、ツールブランチでこのコードをコミットしました。ここで、 masterにマージし直して、 BとCの両方のコンテンツを保持し、実装をメソッド スケルトンに手動で挿入できるようにしたいと考えています。ここでの問題は、コミットCで行が合法的に削除され、新しいメソッドのスケルトンが挿入されたと見なされるため、git がこれを競合と見なさないことです。