😲

git の Merge made by the 'ort' strategy. ってなんだ?!!

2024/03/04に公開

ラブグラフのエンジニア、横江 (@yokoe24) です。

みなさんは git コマンドで merge をしたことがありますか?
ありますね!!


(※ gitg でエイリアス振っていますが、 git merge develop です)

merge をしたときの出力をよく見ると、地味に気になる一文があります。

Merge made by the 'ort' strategy.

なんでしょう、これ・・・?
sort じゃなくて ort ・・・?

気になったので調べてみました。

https://softantenna.com/blog/git-2-33-released/

すぐに出てくるのがこの記事。
2021/08/17 にリリースされた Git 2.33.0 についての記事です。

Gitの新しいマージ戦略「merge-ort」は、再帰的戦略をスクラッチで書き直したもので、正確性やパフォーマンスの問題に対処しています。GitHubによると、名前の変更が多い大規模なマージの場合、merge-ort は500 倍ものスピードアップを達成し、rebase操作におけるマージではmerge-ortは9000 倍以上スピードアップする模様。新しいmerge-ortは既存のマージコードよりも一貫して高速に動作する事が期待されています。

なんかすごそう!!

他にはこういう記事がありました。

https://medium.com/@miladev95/git-merge-ort-strategy-vs-recursive-strategy-8f705f8c30d6

既存の ort strategy と recursive strategy についての対比を書いてくれています。

ただし、この記事内では ort を Ostensibly Recursive Three-way の略だと紹介しているのですが、
実際にコード内を読んでみると、

/*
 * "Ostensibly Recursive's Twin" merge strategy, or "ort" for short.  Meant
 * as a drop-in replacement for the "recursive" merge strategy, allowing one
 * to replace

とあるように、 Ostensibly Recursive's Twin が正しい略なようですので、
記事の正確性には不安が残ります。

いろいろ調べた結果、
一番情報が多く正確性も高そうなのが GitHub のブログでした。さすが GitHub!

https://github.blog/2021-08-16-highlights-from-git-2-33/#merge-ort-a-new-merge-strategy

ここでは、マージ手法として使われていた resolve が2005年には merge-recursive となり、
そして2021年の Git 2.33 で merge-recursive になったこと、
および、アルゴリズム手法の変更によってどういう問題が解決していったのかを説明しています。

詳しいところは理解しきれていませんが、
複数のコミットがあるときに再帰的にマージしていたものを、先に全体感を見てからマージ手順を見ていくことで、
多数のコミットがある場合のマージ速度が高速になっています。

結果として、多数のファイルの名前変更を含み変更ファイル数も多いような、元の merge-recursive が苦手としていた変更において、
マージの速度は 500倍 、 rebaseの速度は 9000倍 となったそうです! すごい!!

また、 メモリ使用量の低減 や、 コンフリクトが起こりにくくなる といった改良にもつながっています。
すごい!

カンタンにですが、 merge-ort の説明でした。

Merge made by the 'ort' strategy.

を見るたびに、素晴らしいアルゴリズムを作った方々への感謝をしようと思います😌

ラブグラフのエンジニアブログ

Discussion