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には、この記事では説明できないほど多くの変更が含まれている。詳細については、公式リリースノートを必ず読んで頂きたい。