変更履歴を維持し、コンフリクトを回避する
Keep the changelog, avoid the conflicts (devenv.sh)
要約
複数の開発者やエージェントが並行して作業する際、CHANGELOG.mdファイルで発生しがちなマージコンフリクトに対処するためのツール「changelog-merge」を紹介します。このツールはKeep a Changelogの標準に従い、独立した変更であっても両方を正しくマージできるようにします。
全文翻訳
変更履歴を維持し、コンフリクトを回避する
2026年10月28日
プロジェクトを流れるコードが増加し、人々やエージェントが並行して変更に取り組んでいます。これは、同じ変更履歴を更新するプルリクエストが増加し、しばしば同時に発生することを意味します。
2つのプルリクエストが、無関係な機能を追加します。どちらもCHANGELOG.mdの先頭に1行を追加します。コードはクリーンにマージされますが、変更履歴はコンフリクトします。
## [Unreleased]### Added<<<<<<< HEAD- Added S3 support.=======- Added SSH support.>>>>>>> ssh-support- Initial feature.
どちらのエントリも変更履歴に属します。コンフリクトは解決が容易ですが、より多くの変更が着地するにつれて繰り返し発生します。
共有の変更履歴は、すべての人々の変更を1つのファイルに、しばしば同じ見出しの下に配置します。Gitは、エントリが独立した作業を記述している場合でも、同じ行に対する競合する編集を認識します。
私たちは、Keep a Changelogに従うファイルに対応するためにchangelog-mergeを構築しました。これはリリース、カテゴリ、エントリを理解します。この例では、両方の追加を保持します。
## [Unreleased]### Added- Added S3 support.- Added SSH support.- Initial feature.
devenv での使用方法
devenv での使用方法セクション
プロジェクトのdevenv.nixで統合を有効にします。
{
changelog-merge.enable = true;
}
環境に入り、通常通りマージします。
devenv shell
git merge ssh-support
devenv は、CHANGELOG.mdのコンフリクトを解決するために、changelog-mergeバイナリを使用するようにGitを構成します。
異なる名前の変更履歴の場合、そのパスを追加します。
{
changelog-merge.enable = true;
git.attributes = [ "docs/CHANGES.md merge=changelog-merge" ];
}
他の貢献者が環境に入ったときに同じセットアップを取得できるように、devenv構成をコミットしてください。その他のオプションについては、統合ドキュメントを参照してください。
通常の Git での使用方法
通常の Git での使用方法セクション
devenv や Nix を使用せずに changelog-merge を使用できます。Rust 1.88 以降がインストールされている場合は、以下を実行します。
cargo install changelog-merge --version 0.1.0 --locked
changelog-mergeがPATH上にあることを確認し、既存の変更履歴を確認します。
changelog-merge check CHANGELOG.md
リポジトリの.gitattributesにこの行を追加します。
CHANGELOG.md merge=changelog-merge
リポジトリ内からマージドライバを登録します。
git config --local merge.changelog-merge.name 'Keep a Changelog semantic merger'
git config --local merge.changelog-merge.driver 'changelog-merge merge %O %A %B --marker-size %L --path %P'
git config --local merge.changelog-merge.recursive binary
.gitattributesをコミットします。各貢献者は、実行可能ファイルをインストールし、クローンで3つの構成コマンドを実行する必要があります。属性はリポジトリと共に移動します。ローカルGit構成は移動しません。
これで git merge、git rebase、git cherry-pick は changelog-merge を自動的に使用できるようになります。セットアップは以下で確認できます。
git check-attr merge -- CHANGELOG.md
git config --get merge.changelog-merge.driver
最初のコマンドは CHANGELOG.md: merge: changelog-merge を報告し、2番目のコマンドは構成したドライバコマンドを出力するはずです。
コンフリクトが依然としてあなたを必要とする場合
両方のブランチが同じエントリを互換性のない方法で書き換えた場合、changelog-merge は解決のためにコンフリクトマーカーを残します。また、変更を確実に一致させることができない場合にもコンフリクトを保持します。独立した追加は自動的にマージできます。競合する変更には依然として決定が必要です。
次の変更履歴の更新ペアで試してみてください。ソースとドキュメントは、マージの動作と制限をカバーしており、プロジェクトの変更履歴でどのように機能するかをお知らせいただければ幸いです。