Ich habe mich immer gefragt, warum Git Hashes gegenüber Revisionsnummern bevorzugt. Revisionsnummern sind (meiner Meinung nach) viel klarer und leichter zu finden: Es gibt einen Unterschied, wenn Sie jemandem sagen, er solle sich die Revision 1200 ansehen oder 92ba93e festschreiben! (Nur um ein Beispiel zu nennen).
Gibt es einen Grund für diesen Entwurf?
version-control
git
Max Beikirch
quelle
quelle
Antworten:
Eine einzelne, monoton ansteigende Revisionsnummer ist nur für ein zentrales Versionskontrollsystem sinnvoll, bei dem alle Revisionen an einen einzigen Ort fließen, an dem Nummern verfolgt und zugewiesen werden können. Sobald Sie in die DVCS-Welt eintreten, in der zahlreiche Kopien des Repositorys vorhanden sind und Änderungen in willkürlichen Workflows abgerufen und auf sie übertragen werden, trifft das Konzept einfach nicht mehr zu. (Zum Beispiel gibt es keinen Ort, an dem Sie Revisionsnummern zuweisen können. Wenn ich Ihr Repository aufteile und Sie ein Jahr später beschließen, meine Änderungen zu übernehmen, wie kann ein System sicherstellen, dass unsere Revisionsnummern nicht in Konflikt geraten?)
quelle
Person 1: "Hey, <P2>, what was revision 12345 for?" P2: "Revision 12345 was commited by <P3>." P3: "I don't have a revision 12345..."
- Wenn ich mich richtig erinnere, hat Mercurial ein ähnliches Problem. Wenn sie git verwenden, haben sie alle identische Referenzen für jedes Commit.P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"
... Basar hat noch GUIDs ...git
. Sie bieten auch eine lokale Revisionsnummer, um die Eingabe zu vereinfachen.Sie benötigen Hashes in einem verteilten System. Angenommen, Sie und ein Kollege arbeiten beide am gleichen Repository, und Sie schreiben beide eine Änderung lokal fest und übertragen sie anschließend. Wer erhält die Revisionsnummer 1200 und wer die Revisionsnummer 1201, wenn keine der Parteien Kenntnis voneinander hat? Die einzig realistische technische Lösung besteht darin, einen Hash der Änderungen mit einer bekannten Methode zu erstellen und die Dinge darauf basierend zu verknüpfen.
Interessanterweise unterstützt HG Versionsnummern, diese sind jedoch ausdrücklich nur lokal verfügbar - Ihr Repository verfügt über einen Satz, das Repo Ihres Kollegen verfügt über einen anderen Satz, je nachdem, wie er verschoben und gezogen wird. Dadurch wird die Verwendung der Befehlszeile ein bisschen benutzerfreundlicher als bei Git.
quelle
Datenintegrität.
Ich bin mit den aktuellen Antworten nicht einverstanden. Für ein DVCS sind keine Hashes erforderlich, siehe Bazaar-Methode . Sie können auch mit jeder anderen Art von global eindeutiger Kennung arbeiten. Die Hashes sind eine Maßnahme zur Gewährleistung der Datenintegrität: Sie stellen eine Zusammenfassung der Informationen dar, die in dem Objekt (Festschreiben, Bäume, ...) enthalten sind, auf das der Hash verweist. Es wird angenommen, dass das Ändern des Inhalts ohne Änderung des Hashs (dh eines Vorab-Angriffs oder eines Kollisionsangriffs ) schwierig, wenn auch nicht unmöglich ist. (Wenn Sie wirklich daran interessiert sind, werfen Sie einen Blick auf den Artikel von Marc Stevens aus dem Jahr 2011 ).
Indem Sie mit dem SHA-Hash auf Objekte verweisen, können Sie überprüfen, ob der Inhalt manipuliert wurde. Und da sie (fast) garantiert eindeutig sind, können sie auch als Revisionskennungen verwendet werden - ganz bequem.
Weitere Informationen finden Sie in Kapitel 9 des Git-Buches.
quelle
Mit den Worten des Laien:
quelle
In mathematischen Begriffen:
quelle
Hash ist nicht die einzige Lösung für verteiltes VCS. Bei einem verteilten System kann jedoch nur die teilweise Anordnung von Ereignissen aufgezeichnet werden. (Für VCS kann das Ereignis ein Commit sein.) Deshalb ist es unmöglich, eine monoton ansteigende Revisionsnummer beizubehalten. Normalerweise verwenden wir so etwas wie eine Vektoruhr (oder einen Vektorzeitstempel), um eine solche teilweise geordnete Beziehung aufzuzeichnen. Dies ist die Lösung, die im Basar verwendet wird .
Aber warum benutzt Git nicht Vector Clock sondern Hash? Ich denke, die Hauptursache ist Kirschbaum . Wenn wir ein Repository mit Cherry Pick bearbeiten, ändert sich die teilweise Reihenfolge der Commits. Die Vektortakte einiger Commits müssen neu zugewiesen werden, um die neue Teilreihenfolge darzustellen. Eine solche Neuzuweisung in einem verteilten System würde jedoch inkonsistente Vektortakte induzieren. Das ist das eigentliche Problem, mit dem sich Hashes befassen.
quelle