質問: プロジェクトディレクトリ内で、開発のたびに追記されていくファイル、もしくはファイル上の追記されていくリストというのがあります。 * パッケージ管理ファイル * URLルーティング定義ファイル * ソース上部のimport, include, require宣言的なリスト * ユーティリティ関数を集めたファイル。関数を追加するときは大体最後に追加する。 * テストコード。新しいテストを(以下略 これらのファイルもしくはパート、複数のフィーチャーブランチを切って並行開発していると大抵マージのときにコンフリクトします。 解決も簡単なのですがコンフリクトというのは自動マージやチェリーピックの妨げになって発生すること自体が邪魔です。 ファイルの種類によってもノウハウが異なってくることとは思いますが、コンフリクトを避けるための工夫でやっていることがあったら教えてください。
回答: こんにちは。 機械的な解決手段として、`.gitattributes`を使うことで管理対象ファイルの取り扱いをカスタマイズすることができた気がしたのでちょっと調べてみました。 `.gitattributes`ファイルを管理対象ディレクトリの直下に配置し、`.gitignore`と同様の記法で対象ファイル/ディレクトリを指定し、`merge`属性にdriverを指定することで、既定のマージ方法をファイル単位で変更することができました。 パッケージ管理ファイル等の追記ファイルであるなら、gitのbuild-in merge driverである`union`を指定することで競合を回避してマージできます。これは、お互いの変更が競合したとき、両方の変更後を並べて取り込んでしまうというシンプルなマージドライバです。なかなか使える場面は限られそうですが、追記専用ファイルには最適だと思います。 厳密な話は公式ドキュメントを読んでみてください。 docs/gitattributes もっと細かくマージ手法をカスタマイズしたい場合、.git/configに自作のマージドライバを定義することができます。シェルスクリプト等でマージ処理を記述し、成功あるいは失敗を返します。githookのような感じですね。 ちなみに、自作driverが何もせずにtrueを返すと、マージ処理開始時のインデックスツリーの状態をマージ成功状態として扱うため、「自分の持つファイルで相手を上書き」する動作になるようです。いわゆる`--ours`指定ですね。 詳しい情報は以下にあります。 book/Customizing-Git-Git-Attributes