Gitは進化したほどには設計されていません。
自分で見てください。公式のgitリポジトリのクローンを作成し、それgitk
(またはお気に入りのグラフィカルgitログビューアー)で開き、その初期のリビジョンを確認します。
元々は非常にコア機能(オブジェクトデータベースとインデックス)しかなかったことがわかります。それ以外はすべて手作業で行われました。ただし、この小さなコアは、シェルスクリプトを使用して簡単に自動化できるように設計されています。gitの初期のユーザーは、一般的なタスクを自動化するために独自のシェルスクリプトを作成しました。これらのスクリプトは少しずつ、gitディストリビューションに組み込まれました(初期の例839a7a0を参照)。新しいニーズが発生するたびに、スクリプトはそれを可能にするように調整されました。ずっと後に、これらのスクリプトのいくつかはCで書き直されます。
クリーンな直交コア(必要に応じて直接使用できます)と、その上に有機的に成長する上層との組み合わせが、gitにパワーを与えます。もちろん、奇妙な名前のコマンドとオプションを大量に提供するのもこのためです。
圧縮、グラフ、リビジョン番号の削除、分岐、隠蔽、リモートの強調...それはどこから来たのですか?
その多くは最初はありませんでした。
各オブジェクトは個別に圧縮され、名前が付けられることで重複が回避されましたが、gitで使用されている高圧縮の原因となっている「pack」ファイルは存在しませんでした。当初の哲学は「ディスク容量は安い」でした。
「グラフ」とはgitk
、のようなグラフィックビューアを意味する場合、後で表示されます(AFAIK、最初のグラフはでしたgitk
)。AFAIK、BitKeeperにもグラフィカルな履歴ビューアがありました。
バージョン番号を取り除くこと、実際にはコンテンツアドレス指定ファイルシステムを使用してオブジェクトを格納するというgitのコアコンセプトは、ほとんどがmonotoneに由来します。当時、モノトーンは遅いものでした。そうでない場合は、Linusがgitを作成する代わりにそれを使用した可能性があります。
分散バージョン管理システムでは、各クローンが個別のブランチとして機能するため、ブランチを強調することはやや避けられません。
隠しておく(git stash
)は、IIRCのごく最近のことです。使用するreflogは最初はありませんでした。
当初はリモコンもありませんでした。最初は、を使用してオブジェクトを手動でコピーしましたrsync
。
これらの機能の1つずつが、誰かによって追加されました。それらのすべてではない-多分それらのほとんどさえ-Linusによって書かれました。誰かがgitが満たさないニーズを感じるたびに、gitのコア「配管」レイヤーの上に新しい機能を作成し、それを含めることを提案できます。それが良ければ、おそらく受け入れられ、gitのユーティリティ(およびコマンドラインの複雑さ)がさらに強化されます。