web-dev-qa-db-ja.com

Gitはどのように設計されましたか?

私の職場は最近Gitに切り替わり、私はそれを愛しています(そして嫌いです!)。私は本当にそれを愛し、それは非常に強力です。私が嫌いな唯一の部分は、時々それがあまりにも強力であるということです(そして多分少し簡潔で混乱しています)。

私の質問は... Gitはどのように設計されましたか?短時間使用するだけで、他のバージョン管理システムではできなかった多くのあいまいなワークフローを処理できるという感じがします。しかし、それはまた、下にあるエレガントな感じです。そして速い!

これは、Linusの才能に一部疑いの余地はありません。しかし、私は疑問に思っています、gitの全体的なデザインは何かに基づいていますか? BitKeeperについて読みましたが、アカウントは技術的な詳細が不十分です。圧縮、グラフ、リビジョン番号の削除、分岐、隠蔽、リモートの強調...それはどこから来たのですか?

ライナスは本当にこれを公園から追い出しました、そして最初の試みのほとんどで!学習曲線を過ぎてから使用すると非常に便利です。

9
Mark Canlas

Gitはevolvedほど設計されていません。

自分で見てください。 公式gitリポジトリ のクローンを作成し、gitk(またはお気に入りのグラフィカルgitログビューア)で開いて、最初のリビジョンを確認します。

元々は非常にコア機能(オブジェクトデータベースとインデックス)しかなかったことがわかります。他はすべて手作業で行われました。ただし、この小さなコアは、シェルスクリプトを使用して簡単に自動化できるように設計されています。 gitの初期のユーザーは、一般的なタスクを自動化するために独自のシェルスクリプトを作成しました。これらのスクリプトは少しずつgitディストリビューションに組み込まれました(初期の例については 839a7a を参照)。新しいニーズが発生するたびに、スクリプトはそれを可能にするように調整されました。ずっと後に、これらのスクリプトのいくつかはCで書き直されます。

クリーンな直交コア(必要に応じて直接使用できます)と、その上に有機的に成長する上層との組み合わせが、gitにパワーを与えます。もちろん、奇妙な名前のコマンドとオプションを大量に提供するのもこのためです。


圧縮、グラフ、リビジョン番号の除去、分岐、隠蔽、リモートの強調...それはどこから来たのですか?

その多くは最初はありませんでした。

各オブジェクトは個別に圧縮され、名前が重複することは避けられましたが、gitで使用されている高圧縮の原因となっている「pack」ファイルは存在しませんでした。当初の哲学は「ディスク容量は安い」でした。

「グラフ」とは、gitkのようなグラフィックビューアを意味する場合、後で表示されます(AFAIK、最初のグラフはgitkでした)。私の知る限り、BitKeeperにはグラフィカルな履歴ビューアもありました。

バージョン番号を取り除くこと、実際にはコンテンツアドレスファイルシステムを使用してオブジェクトを格納するというgitのコアコンセプトは、主に monotone から来ています。当時、モノトーンは遅いものでした。そうでない場合は、Linusがgitを作成する代わりにそれを使用した可能性があります。

各クローンは個別のブランチとして機能するため、分散バージョン管理システムではブランチを強調することはやや避けられません。

隠しておく(git stash)は、IIRCの最新のものです。使用するreflogは最初はありませんでした。

当初はリモコンもありませんでした。最初は、rsyncを使用して手動でオブジェクトをコピーしました。

これらの機能の1つずつが、誰かによって追加されました。それらのすべてではない-多分それらのほとんどさえ-Linusによって書かれました。誰かがgitが満たさない必要性を感じるたびに、gitのコア「配管」レイヤーの上に新しい機能を作成し、それを含めることを提案できます。それが良ければ、おそらく受け入れられ、gitのユーティリティ(およびコマンドラインの複雑さ)がさらに強化されます。

17
CesarB

要点は、gitは地球上で最も資格のある人がそのように設計したということです。そして、私は才能について話しているのではなく、経験について話している:サイズと数のコントリビューターのコンビネーションをLinuxカーネルと同等に組み合わせ、実際にほとんどの統合を処理しているコードベースを担当している人は他にいないと思う自分で働きます。

そのため、Linusは、分散バージョン管理システムの要件と使用例を誰よりもよく知っていました。そしてもちろん、彼が扱っていたコーディングのほとんどがC言語で行われていて、そのほとんどがパフォーマンスにとって重要であるということにも役立ちました。

基本的にそれは自分のかゆみを掻く究極の例です。

7

The Git Parable で説明されているとおりに設計されています。

テキストエディタといくつかのファイルシステムコマンドだけを備えたコンピュータがあるとします。ここで、このシステムで大規模なソフトウェアプログラムを作成することを決定したとします。あなたは責任あるソフトウェア開発者なので、以前に変更または削除したコードを取得できるように、ソフトウェアのバージョンを追跡する何らかの方法を発明する必要があると判断しました。以下は、そのようなバージョン管理システム(VCS)を1つ設計する方法と、それらの設計選択の背後にある理由についてのストーリーです。

6
Graham Borland