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


9

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

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

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

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


おそらくあなたはgit IRCチャンネル(#git on freenode)でいくつかの助けを得ることができます
yati sagade


2
you get the feel that it can handle many obscure workflows that other version control systems could not:これはおそらく、Linuxカーネル、悪名高いハック、大規模で複雑なコードの一部を処理するように設計されたためです。
yannis

1
:Gitの10周年には、ここではTorvalds氏のインタビューからの記事ですlinux.com/news/featured-blogs/185-jennifer-cloer/...
シュリダールSarnobat

回答:


17

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のユーティリティ(およびコマンドラインの複雑さ)がさらに強化されます。


「AFAIK、BitKeeperにもグラフィカルな履歴ビューアがありました。」はい、そうです。美しくはありませんが、非常に機能的です。bitkeeper.com/Test.Using.Looking.htmlを参照してください。ただし、ブランチがどのように表示されるかを示すのは不十分です。
Bryan Oakley

1
また、興味深い読み物です。gitの
CesarB

プログラマーはgitの一部の機能をcvs + rsync + httpdでエミュレートしていましたか?どんな手作りの解決策が可能であったか聞いてみたいです。
Sridhar Sarnobat 2014年

7

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

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

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


6
「単一の最も適格」?私はそうは思いません。分散ソース管理を書く資格がある賢い人はたくさんいます。BitMover(BitKeeperの背後にある会社)のスタッフは、彼らが何をしているのか本当によく知っています。Linusは、ソースコード管理どのように機能するかを彼に示したことで、Larry McVoyの功績さえ認めています。ラリーがいなければ、gitはありません。
ブライアンオークリー

1
@BryanOakley、誰かが誰かを誰かのために何かを補完し​​ているとき、バッシングを避けることができると思います。ハイインサイドは、要件が優れた開発者になることを誰もが知っています。それで、もし明日、あなたが大きな問題を抱えているなら、私たちはデニス・リッチーと同じようにあなたを覚えているかもしれません。誰も他の人より優れているわけではありません。彼らが世界中で認められ、最初にソリューションを提供した要件に出会っただけです。
Pankaj Upadhyay

2
@ブライアン:BitKeeperを使用した経験がLinusにも多くのことを教えたと私は確信しています。そして、確かに、自分のやっていることを知っている、他の多くの賢くて資格のある人々がいます。しかし、カーネルの保守におけるLinusの経験は、彼を最も経験豊富な資格のある人物にしています。私は間違っているかもしれませんが、同じくらい大きな別のプロジェクトを指摘できますか?同じくらい多くの貢献者がいて、そのすべての責任者が、それらすべての貢献者の実際のコードを一緒に機能させるのに深く関与していますか?
Michael Borgwardt

@Pankaj Upadhyay:私は誰にも打ちのめしているのではなく、なぜ私が答えに反対票を投じたのかを単に説明していました。「ソリューションを最初に提供した」ということについては、gitがなんらかの点で「最初」だったと思いますか。最初は何だったと思いますか?これは確かに、ロングショットで最初に配布されたscmツールではありませんでした。
ブライアンオークレー

1
@DeadMG:そのステートメントのより重要な部分は、後に「...そしてその大部分はパフォーマンスが重要」になります。あなたがそれをよく知っていれば、Cは低オーバーヘッドの高性能コードを実装するのにあまり適していないと主張する多くの人を見つけることはないでしょう。
Michael Borgwardt

6

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.