Wie wurde Git entworfen?


9

Mein Arbeitsplatz wurde kürzlich auf Git umgestellt und ich habe ihn geliebt (und gehasst!). Ich liebe es wirklich und es ist extrem mächtig. Der einzige Teil, den ich hasse, ist, dass es manchmal zu mächtig ist (und vielleicht ein bisschen knapp / verwirrend).

Meine Frage ist ... Wie wurde Git entworfen? Wenn Sie es nur für kurze Zeit verwenden, haben Sie das Gefühl, dass es viele obskure Workflows verarbeiten kann, die andere Versionskontrollsysteme nicht können. Aber es fühlt sich auch darunter elegant an. Und schnell!

Dies ist zweifellos teilweise auf Linus 'Talent zurückzuführen. Aber ich frage mich, ob das Gesamtdesign von Git auf etwas basiert? Ich habe über BitKeeper gelesen, aber die Konten enthalten nur wenige technische Details. Die Komprimierung, die Grafiken, das Entfernen von Revisionsnummern, das Hervorheben von Verzweigungen, Verstecken, Fernbedienungen ... Woher kam das alles?

Linus hat diesen wirklich aus dem Park geworfen und so ziemlich beim ersten Versuch! Es ist ziemlich gut zu verwenden, wenn Sie die Lernkurve hinter sich haben.


Wahrscheinlich könnten Sie Hilfe auf dem Git-IRC-Kanal (#git auf Freenode) bekommen
Yati Sagade


2
you get the feel that it can handle many obscure workflows that other version control systems could not: Das liegt wahrscheinlich daran, dass es für den Linux-Kernel entwickelt wurde, einen notorisch hackigen, großen und komplexen Code.
Yannis

1
Zum 10-jährigen Jubiläum von Git hier ein Artikel aus einem Interview mit Torvalds: linux.com/news/featured-blogs/185-jennifer-cloer/…
Sridhar Sarnobat

Antworten:


17

Git wurde nicht so sehr entwickelt wie entwickelt .

Schauen Sie selbst. Klonen Sie das offizielle Git-Repository , öffnen Sie es in gitk(oder Ihrem bevorzugten grafischen Git-Log-Viewer) und sehen Sie sich die frühesten Revisionen an.

Sie werden sehen, dass es ursprünglich nur die Kernfunktionalität hatte (die Objektdatenbank und den Index). Alles andere wurde von Hand gemacht . Dieser kleine Kern wurde jedoch so konzipiert, dass er einfach per Shell-Scripting automatisiert werden kann. Die frühen Benutzer von git haben ihre eigenen Shell-Skripte geschrieben, um allgemeine Aufgaben zu automatisieren. Nach und nach wurden diese Skripte in die Git-Distribution aufgenommen (siehe ein frühes Beispiel 839a7a0 ). Jedes Mal, wenn ein neuer Bedarf bestand, wurden die Skripte angepasst, um dies zu berücksichtigen. Viel später würden einige dieser Skripte in C umgeschrieben.

Diese Kombination eines sauberen, orthogonalen Kerns (den Sie bei Bedarf immer noch direkt verwenden können) mit einer oberen Schicht, die organisch darüber gewachsen ist, verleiht git seine Kraft. Natürlich gibt es auch die große Menge an seltsam benannten Befehlen und Optionen.


Die Komprimierung, die Grafiken, das Entfernen von Revisionsnummern, das Hervorheben von Verzweigungen, Verstecken, Fernbedienungen ... Woher kam das alles?

Vieles davon war am Anfang nicht da.

Während jedes Objekt einzeln komprimiert wurde und Duplikate durch ihre Benennung vermieden wurden, existierten die "Pack" -Dateien, die für die hohe Komprimierung verantwortlich sind, die wir in Git gewohnt sind, nicht. Die Philosophie am Anfang war "Speicherplatz ist billig".

Wenn mit "den Grafiken" grafische Betrachter gemeint sind gitk, erscheinen sie später (AFAIK, die erste war gitk). AFAIK, BitKeeper hatte auch einen grafischen Verlaufsbetrachter.

Das Entfernen der Versionsnummern, in der Tat das Kernkonzept von git, ein inhaltsadressiertes Dateisystem zum Speichern der Objekte zu verwenden, kam größtenteils von monoton . Zu dieser Zeit war monoton langsam; Wenn dies nicht der Fall wäre, hätte Linus es möglicherweise verwendet, anstatt Git zu erstellen.

Das Hervorheben der Verzweigung ist auf einem verteilten Versionskontrollsystem unvermeidlich, da jeder Klon als separate Verzweigung fungiert.

Stashing ( git stash) ist, IIRC, ziemlich neu. Die Reflogs, die es verwendet, waren am Anfang nicht da.

Sogar Fernbedienungen waren anfangs nicht da. Ursprünglich haben Sie die Objekte von Hand mit kopiert rsync.

Jede dieser Funktionen wurde einzeln von jemandem hinzugefügt. Nicht alle von ihnen - vielleicht nicht einmal die meisten - wurden von Linus geschrieben. Jedes Mal, wenn jemand ein Bedürfnis verspürt, das Git nicht erfüllt, kann man ein neues Feature über Git's Kernschicht "Sanitär" erstellen und es zur Aufnahme vorschlagen. Wenn es gut ist, wird es wahrscheinlich akzeptiert, was den Nutzen von git (und seine Befehlszeilenkomplexität) noch weiter verbessert.


"AFAIK, BitKeeper hatte auch einen grafischen Verlaufsbetrachter." Ja tut es. Es ist nicht gerade hübsch, aber es ist sehr funktional. Siehe bitkeeper.com/Test.Using.Looking.html , obwohl dies schlecht zeigt, wie Zweige angezeigt werden.
Bryan Oakley

1
Ebenfalls eine interessante Lektüre, einige ausgewählte E-Mails vom Anfang von Git, die ein wenig von seiner anfänglichen Entwicklung zeigen: kerneltrap.org/node/4982
CesarB

Haben Programmierer einige Funktionen von git mit cvs + rsync + httpd emuliert? Es würde mich interessieren, welche hausgemachten Lösungen möglich sind.
Sridhar Sarnobat

7

Ich denke, der Hauptpunkt ist einfach, dass Git von der qualifiziertesten Person der Welt dafür entworfen wurde. Und ich spreche nicht von Talent, ich spreche von Erfahrung: Ich bezweifle, dass es jemanden gibt, der für eine Codebasis mit einer vergleichbaren Kombination aus Größe und Anzahl der Mitwirkenden wie der Linux-Kernel verantwortlich ist und sich immer noch mit dem größten Teil der Integration befasst selbst arbeiten.

Daher kannte Linus die Anforderungen und Anwendungsfälle für ein verteiltes Versionskontrollsystem besser als jeder andere. Und natürlich hat es geholfen, dass der größte Teil der Codierung, mit der er sich befasste, in C war und ein Großteil davon leistungskritisch.

Im Grunde ist es das ultimative Beispiel für das Kratzen des eigenen Juckreizes.


6
"Single am besten qualifiziert"? Das glaube ich nicht. Es gibt viele kluge Leute, die qualifiziert sind, verteilte Quellcodeverwaltung zu schreiben. Die Jungs von BitMover (der Firma hinter BitKeeper) wissen wirklich wirklich , was sie tun. Linus würdigt Larry McVoy sogar dafür, dass er ihm gezeigt hat, wie die Quellcodeverwaltung funktionieren sollte . Ohne Larry gäbe es keinen Idioten.
Bryan Oakley

1
@BryanOakley, ich denke, wir können es vermeiden, zu verprügeln, wenn jemand jemanden für etwas Gutes ergänzt. Jeder weiß, dass diese Anforderung einen großartigen Entwickler ausmacht. Wenn Sie also morgen vor einem großen Problem stehen, werden wir uns vielleicht an Sie erinnern, genau wie wir es bei Dennis Ritchie tun. Keiner ist besser als der andere, nur dass sie auf eine weltweit anerkannte Anforderung gestoßen sind und zuerst eine Lösung bereitgestellt haben.
Pankaj Upadhyay

2
@Bryan: Ich bin sicher, dass die Erfahrung mit BitKeeper Linus auch viel beigebracht hat, und das hätte ich erwähnen sollen. Und sicher gibt es viele andere kluge, qualifizierte Leute, die wissen, was sie tun. Aber ich bleibe dabei , dass Linus Erfahrung den Kernel bei der Aufrechterhaltung macht ihn die meisten qualifiziert, Erfahrung weisen. Ich kann mich irren, aber können Sie auf ein anderes Projekt hinweisen, das so groß ist und so viele Mitwirkende hat und bei dem die verantwortliche Person immer noch so stark daran beteiligt ist, den eigentlichen Code all dieser Mitwirkenden zur Zusammenarbeit zu bringen?
Michael Borgwardt

@Pankaj Upadhyay: Ich verprügele niemanden, ich habe nur erklärt, warum ich die Antwort abgelehnt habe. Sie sagten etwas über "zuerst eine Lösung bereitgestellt", was meiner Meinung nach bedeutet, dass git in gewisser Hinsicht irgendwie "zuerst" war. Was denkst du war es zuerst? Es war bei weitem nicht das erste verteilte scm-Tool.
Bryan Oakley

1
@DeadMG: Der wichtigere Teil dieser Aussage kommt danach "... und ein Großteil davon ist leistungskritisch". Ich bezweifle, dass Sie viele finden werden, die argumentieren, dass C nicht sehr gut für die Implementierung von Hochleistungscode mit geringem Overhead geeignet ist, wenn Sie ihn gut kennen.
Michael Borgwardt

6

Es wurde ziemlich genau wie in The Git Parable beschrieben entworfen .

Stellen Sie sich vor, Sie haben einen Computer, auf dem sich nur ein Texteditor und einige Dateisystembefehle befinden. Stellen Sie sich nun vor, Sie haben beschlossen, ein großes Softwareprogramm auf diesem System zu schreiben. Da Sie ein verantwortungsbewusster Softwareentwickler sind, müssen Sie eine Methode erfinden, mit der Sie die Versionen Ihrer Software verfolgen können, damit Sie zuvor geänderten oder gelöschten Code abrufen können. Was folgt, ist eine Geschichte darüber, wie Sie ein solches Versionskontrollsystem (VCS) entwerfen könnten, und die Gründe für diese Entwurfsentscheidungen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.