概要

Git 2.54が正式リリースされた。今回のリリースには137名以上のコントリビューター(うち66名は初めての貢献者)による機能追加とバグ修正が含まれており、ハイライトはGit 2.53と2.54の両バージョンにまたがっている。最大の目玉は、長年の課題だった git rebase -i によるインタラクティブなリベース操作を不要にする実験的コマンド git history の導入だ。これによりCI/CDパイプラインへの組み込みやスクリプト化が大幅に容易になると期待される。

実験的コマンド git history

git history は、複雑な git rebase -i を使わずにシンプルな履歴書き換えを行うために設計された新コマンドで、現時点では実験的扱いとなっている。

  • git history reword — 指定したコミットのメッセージだけをエディタで編集し、そのコミットより先にある子孫ブランチを自動的に更新する。作業ツリーやインデックスには一切影響しない。
  • git history splitgit add -p に似たインターフェースで、単一コミットを複数に分割できる。各 hunk ごとに新しいコミットへ追加するかどうかをインタラクティブに選択できる。

設計の哲学は「単純なケースに git rebase -i の複雑さは不要」というもので、マージコミットを含む履歴には非対応となっている。

設定ファイルベースのフック機構

従来の .git/hooks/ ディレクトリにシェルスクリプトを置く方式に加え、Git設定ファイル内でフックを定義できるようになった。

[hook "linter"]
   event = pre-commit
   command = ~/bin/linter --cpp20

この新機構では、システム全体(/etc/gitconfig)やユーザー個別(~/.gitconfig)での一元管理が可能になる。同一イベントに対して複数のフックを定義して順次実行でき、enabled = false で個別に無効化することもできる。現在の設定は git hook list で確認できる。

ジオメトリック再パックのデフォルト化とその他の改善

Git 2.52で導入されたジオメトリック(幾何学的)再パック戦略が、Git 2.54からデフォルトの保守戦略となった。全オブジェクトを1つのパックファイルにまとめる従来の gc と異なり、オブジェクト数が幾何級数的な構成を自動検出して必要な場合のみ完全なGCを実行するため、大規模リポジトリでのリソース消費を大幅に削減できる。

その他の主な改善点は以下の通り:

  • git add -p の改善 — hunk ナビゲーション時に受け入れ/スキップの履歴を表示、--no-auto-advance フラグを追加
  • HTTP 429 自動リトライRetry-After ヘッダーを尊重して自動リトライ。http.maxRetrieshttp.maxRetryTime で挙動を制御可能
  • git log -L の強化 — 標準的な diff パイプラインに統合され、-S(内容検索)や -G(パターン検索)との組み合わせが可能になった
  • git rebase --trailer — リベース対象の全コミットに Reviewed-by などのトレーラーを自動付与できる
  • git blame --diff-algorithm — histogram / patience / minimal など diff アルゴリズムを選択可能になった
  • 非 ASCII エイリアス対応[alias "hämta"] のような多言語エイリアスを新しい subsection 形式でサポート

内部アーキテクチャとしては、オブジェクトデータベース(ODB)がプラグイン可能なバックエンド設計に再構築されている。直接的なユーザー向け変更はないが、将来的に代替ストレージバックエンドの実装を可能にする重要な基盤となる。