Gitの最新リリースであるGit 2.22の最も重要な新機能は、マージを含むような特殊なブランチトポロジをフラット化せずにリベース可能になったことと、リベース機能をインタラクティブに使えるようになったことだ。
コミットのリベースは、masterなどのベースブランチが変更された後でフィーチャーブランチをマージする場合でも、Gitの履歴を線形に保つことのできるという、優れた方法だ。このようなケースにおいて、2つの分離したブランチの変更が失われないようにするためにGitで使用される標準的なアプローチは、フィーチャーブランチにmasterをマージする前にmasterをフィーチャーブランチにマージすることだ。これにより、単独では解決できないマージ競合を解決する機会が得られると同時に、3方向のマージが必要な場合のマージ操作を明示的に表現したmasterブランチのコミットトポロジが形成される。
マージ操作とは逆に、分離したmasterブランチの最上位コミットにリベースすれば、masterの最先端のコミットからのブランチで作業を開始したように振る舞うことが可能になり、コンフリクトの発生を回避することができる。この場合のmasterブランチの履歴には、ブランチを作成してそれをmasterにマージした事実の痕跡は表示されなくなる。つまり、履歴全体が直線的に表示されるのだ。
後者のアプローチは、サブブランチやマージのように、リベースしたいフィーチャーブランチそれ自体が複雑なトポロジを生成している場合には機能しない。この問題を修正するために新設された"--rebase-merges"オプションでは、新たなベース上に一連のコミットを再生することで、リベース後のブランチトポロジを維持する。さらに新バージョンは、リネームやスカッシュ(squash)、並べ替えなどをインタラクティブに実行可能なリベース機能も備えている。概念的には、インタラクティブ機能を使用したrebase-mergesは、preserve-merges実行後にrebase -iを行うことと(ほぼ)等価である。事実Git 2.22では、preserve-mergesオプションは非推奨となっており、rebase-mergesの使用が推奨されている。Stack Overflowには、rebase-mergesのアルゴリズムに関する激しい議論が見られる。
Git 2.22の変更点はrebase-mergesサポートだけではなく、他にも多くの新機能やバグ修正が含まれている。特に注目すべきなのは以下のものだ。
-
userに対する許可よりも詳細な定義が必要な場合に、authorとcommitterの名前とEメールを、新たなコンフィギュレーション変数で定義できるようになった。 -
"
git branch --show-current"の実行により、現在のブランチの名前を取得することができる。 -
ブランチからディレクトリをチェックアウトして、現在のツリーに新たに追跡ファイルが含まれている場合、Gitはデフォルトでは後者にタッチしないので、チェックアウトしたブランチと現在のブランチのファイルが混在するようになる。
git checkoutで"--no-overlay"オプションを指定することで、必要に応じて追跡ファイルを削除したり、再成することが可能になった。
Git 2.22には、この記事では説明できないほど多くの変更が含まれている。詳細については、公式リリースノートを必ず読んで頂きたい。