Git 2.54、新実験コマンドgit history投入
Gitプロジェクトが日本時間4月21日未明にGit 2.54.0を公開した。目玉は新しい実験コマンドgit history。コミット書き換えの代名詞だったgit rebase -iの複雑さに、正面から別解を出してきた。
Gitプロジェクトが日本時間4月21日未明にGit 2.54.0を公開した。目玉は新しい実験コマンドgit history。コミット書き換えの代名詞だったgit rebase -iの複雑さに、正面から別解を出してきた。
rebase -iの重さに別解が必要だった
Gitで過去のコミットを書き換えるとき、多くの人が最初に思い浮かべるのはgit rebase -iだ。順序を入れ替え、まとめ、メッセージを書き直し、ドロップする。柔軟性は確かに高い。
だがその柔軟性の代償は小さくない。対話式リベースは一定の範囲のコミットを対象に動き、ワーキングツリーとインデックスを順に更新しながら進行する。途中でコンフリクトが出れば、解決するまで次に進めない。
やりたいことが「3つ前のコミットメッセージの誤字を直したい」「1つのコミットを2つに割りたい」だけのとき、この重装備は明らかに過剰だ。todoリストを整え、edit対象をマークし、解決まで走り切る手間をかけたい人は少ない。
Git 2.54で実験的に投入されたgit historyは、まさにこの「軽い書き換え」を専門に扱う新しいコマンドとして設計された。サポートするのは現時点で2つの操作、rewordとsplitだ。
git history reword ── メッセージだけを直す
git history reword <commit>を実行すると、指定したコミットのメッセージがエディタで開き、その場で書き換わる。そのコミットから派生するブランチも自動で更新される。
重要なのは、このコマンドがワーキングツリーを触らないという点だ。つまりベアリポジトリでも動く。サーバー上で過去のコミットメッセージだけ直したい、というサーバー運用のシナリオでも素直に使える。
rebase -iでは、ファイルを実際にチェックアウトしながら進むため、作業ディレクトリの状態に気を配る必要があった。その制約から解放されている点が、このコマンドの設計思想を端的に表す。
git history split ── コミットを2つに割る
もう一方のgit history split <commit>は、1つのコミットを対話的に2つに分割する。git add -pを使ったことがある人には、操作感がすぐに馴染むはずだ。ハンクごとに採否を問われ、選んだぶんが新しい親コミットとして切り出される。
$ git history split HEAD
diff --git a/bar b/bar
new file mode 100644
index 0000000..50810a5
--- /dev/null
+++ b/bar
@@ -0,0 +1 @@
+bar
(1/1) Stage addition [y,n,q,a,d,p,?]? y
選んだハンクが新しいコミットの親になり、選ばなかった残りが元のコミットに残る。その後ろにぶら下がっていたブランチは、自動的に新しい履歴へ張り替えられる。
意図的な制約もある。マージコミットを含む履歴はサポートされず、コンフリクトが発生しそうな操作は実行を拒む。git historyは開放的な歴史改変ではなく、ピンポイントの書き換えに絞った道具として設計されている。そこは潔い。
実装面では、git historyは既存のgit replayのコア機構を部品として再利用している。replay側もこのタイミングで、共通部分がライブラリとして切り出された。将来的にスクリプトや自動化から履歴操作を呼ぶ用途でも、一貫した基盤の上で動く。
コマンドは依然として実験ステータスであり、インターフェースは今後変わる可能性がある。
設定ファイルで定義するフック
Git 2.54のもうひとつの大きな変更が、設定ベースのフック定義だ。これまでGitのフックは.git/hooks/配下、あるいはcore.hooksPathが指すディレクトリに実行可能スクリプトとして置くしかなかった。
複数のリポジトリで同じpre-commitフックを使いたいとき、これは地味に厄介な問題を生む。各リポジトリにスクリプトをコピーする、シンボリックリンクを張る、サードパーティのフック管理ツールに頼る。どれも本筋ではない手間だった。
2.54以降はgitconfigにこう書ける。
[hook "linter"]
event = pre-commit
command = ~/bin/linter --cpp20
~/.gitconfig、システムワイドの/etc/gitconfig、リポジトリローカルの設定、どこでも書ける。つまり「全リポジトリで共通のフック」と「このリポジトリだけのフック」を、同じ仕組みで両立できる。
さらに、同じイベントに対して複数のフックを並べて実行できる。リンターとシークレットスキャナーを両方pre-commitで回したい、という需要がそのまま設定として表現できるようになった。個別のフックはhook.<n>.enabled = falseで無効化もできる。
従来の$GIT_DIR/hooksスクリプトも引き続き動作し、設定で定義されたフックの後に実行される。既存の仕組みは壊さず、新しい層だけが積み上がる。
メンテナンスの既定戦略がgeometricに
バックグラウンドで走るメンテナンス、具体的にはgit maintenance runの既定挙動も、2.54で切り替わった。従来のgcタスクからgeometric戦略がデフォルトに昇格している。
geometric戦略はリポジトリ内のパックファイルを検査し、オブジェクト数が幾何級数になるよう段階的に統合する。伝統的なgcのように全パックを1つにまとめ直すのではなく、必要に応じて部分的にまとめていく方式だ。巨大なリポジトリで「gcが走るたびに全パックが再構築されて重い」という問題への実践的な回答になっている。
すでにmaintenance.strategy = geometricを明示していた人に変化はない。設定なしで使っていた人は、知らないうちに挙動が軽くなる方向へ切り替わることになる。
細かいが実用的な改良たち
メインの3つ以外にも、日常で役立つ変更が多い。
git log -Lが標準のdiffパイプラインを通るようになり、-Sや-Gといったpickaxe検索と組み合わせられるようになった。関数単位で履歴を追いつつ、特定の識別子の増減だけを拾う、といった絞り込みが素直に書ける。
HTTPトランスポートがHTTP 429(Too Many Requests)を理解するようになったのも地味に大きい。これまで429は即座にfatalだったが、2.54からはRetry-Afterヘッダを尊重してリトライを試みる。http.retryAfter、http.maxRetries、http.maxRetryTimeの各設定で挙動を制御できる。ホスティング側のレート制限にぶつかってCIが落ちる、という類のトラブルに対してGit自身が最初の防波堤になった。
エイリアス名の制約も緩んだ。これまでASCIIの英数字とハイフンに限定されていたが、[alias "hämta"]のようなサブセクション記法で、任意の文字(改行とNULを除く)が使えるようになった。母語でGitコマンドに別名を付けたい人には嬉しい変更だ。期限切れのGPG鍵で署名されたコミットが、赤色で「壊れた署名」扱いされる問題も直った。署名自体は有効である以上、そう表示するのが筋であり、ようやく挙動が直感と一致した。
137人、66人の新顔
今回のリリースには、メンテナである濱野純(Junio C Hamano)のアナウンスによれば、137人の貢献者が関わり、うち66人が新規貢献者だという。v2.53.0からのnon-mergeコミットは771個。
本来ならv2.54.0リリース直後は、次サイクルのnextブランチを整え、最初のマージウィンドウを開く時期だ。だが今回、濱野は数週間オフラインになると表明している。後任の暫定メンテナは指名されておらず、コミュニティが自律的に回せるか、というのが本人の姿勢だ。20年続いてきたプロジェクトの日常的な判断を、ここでコミュニティに委ねてみる。珍しい光景ではある。git historyはまだ実験段階であり、インターフェースは今後変わりうる。それでも、rebase -iの複雑さを「そのまま受け入れるか、諦めるか」の二択を強いられてきた現場にとって、新しい選択肢が増えた意味は小さくない。
使い方はgit history rewordとgit history split。実験段階の割り切りと付き合えるなら、一度触ってみるといい。
参照元
関連記事
- SDLがAI生成コードを全面拒否、AGENTS.mdで「門前払い」を宣言
- Linuxカーネル、AI生成コードを条件付きで容認へ
- アポロ11号のソースコード、GitHubでパブリックドメイン公開
- Rust Coreutils 0.8が登場、dd 45%高速化とブラウザ実行環境
- Claude Code劣化問題、AMDのAI責任者が膨大なログで告発
- Claude Codeソース流出が招いた罠:偽リポジトリがマルウェアを配布
- GitHub Copilotが個人ユーザーのコードをAI学習に使う──4月24日から
- GitHub Copilot、6月からトークン課金へ移行
- Windows 95で動くWSL、独立開発者が公開
- Ubuntu 26.04、完全Rust化先送り44件のCVE