オープンソースのGitプロジェクトは、104人を超える貢献者による機能追加とバグ修正を盛り込んだGit 2.56.0をリリースした。貢献者のうち39人は今回初めてプロジェクトに参加した。前のバージョンはGit 2.55だった。
新バージョンでは、マージの競合を解消する際に、関連するパスだけをステージングするための`git add –resolved`オプションが追加された。このモードは、ディレクトリ内のマージされていないパスを評価し、ステージング前に通常のファイルに残っている競合マーカーを確認する。マーカーが見つかった場合は該当するパスを通知し、ディレクトリを変更しない。これにより、`notes.txt`のような競合とは無関係なローカル変更をステージングせず、解決済みの`recipe.txt`をステージングできる。パスパターンによって選択範囲を絞り込むこともできるが、選択したファイルのいずれかにマーカーがある場合は、どのファイルもステージングされない。解決済みの削除とバイナリーの競合は通常どおり処理される。このオプションは`git add -u`または`git add -A`と組み合わせることはできず、これまで競合していなかった追跡対象ファイルは無視する。
Git 2.56では、共通の祖先を探す処理も高速化されている。Gitは2つのコミット地点から後方に進み、両方の側から到達可能なマージベースを見つける。Criss-crossマージでは複数のベースが必要になる場合があるため、検索はすべてのベースが特定されるまで続く。新しい追跡メカニズムは、いずれか一方の側に固有の保留中のコミットが尽きた時点で、新たな共通地点が形成されることはないと判断し、すべてのマージベースを保持したまま検索を停止する。
なぜ重要なのか
新しいステージングモードにより、マージコンフリクトに直面した開発者は、解決が完了したファイルをローカル変更と混在させずに分けて扱えるようになる。これは特に、同じ作業ディレクトリで異なる編集を進めるチームにとって、エラーのリスクを低減する。競合マーカーの検査は、未完了の内容を誤って記録の準備対象にすることを防ぐ追加のチェックとなる。共通の祖先の検索における改善は、多数のブランチやCriss-crossマージを含むリポジトリで、Gitが必要な履歴情報に到達する方法に影響を与える。これにより、このリリースは新しいコマンドを提供するだけでなく、複雑な履歴を扱う処理の挙動も対象としている。ただし、これらの変更が異なるワークフローでどの程度採用されるのか、またパフォーマンスの向上がどのリポジトリで顕著になるのかは、依然として明らかではない。