Versionskontrolle (auch bekannt als Revisionskontrolle).
Betrachten Sie das folgende Problem. Sie arbeiten mit einer anderen Person an einem Projekt und tauschen Dateien aus. Sie müssen beide an, sagen wir, "WhateverController.java" arbeiten. Es ist eine große Datei und Sie müssen sie beide bearbeiten.
Die primitivste Art, damit umzugehen, ist, die Datei nicht gleichzeitig zu bearbeiten, aber dann müssen Sie beide auf der gleichen Seite sein. Wenn Sie ein Team haben, vor allem, wenn das Team Dutzende oder Hunderte oder Tausende von Mitgliedern hat (typisch für Open-Source-Projekte), wird dies völlig unmöglich.
Eine alte, primitive "Lösung" für dieses Problem war ein Checkout/Checkin-Mechanismus. Wenn Sie eine Datei bearbeiten müssen, "checken Sie sie aus", und die Datei wird gesperrt, so dass niemand sie bearbeiten kann, bis Sie sie durch "Einchecken" entsperren. Dies geschieht durch die entsprechende Software, zum Beispiel Microsofts atemberaubend dummes Stück Mist SourceSafe. Aber wenn man vergisst, die Datei "einzuchecken", kann niemand sonst diese Datei bearbeiten, solange sie in Gebrauch ist. Dann geht jemand in den Urlaub oder verlässt das Projekt aus einem anderen Grund und das Ergebnis ist ein nicht enden wollendes Chaos, Verwirrung und in der Regel eine ganze Menge verlorener Code. Das bedeutet einen enormen Verwaltungsaufwand.
Dann kam CVS und später Subversion, das die Autoren als "CVS done right" bezeichnen, CVS und Subversion sind also im Wesentlichen dasselbe. Bei diesen Systemen gibt es kein tatsächliches Auschecken. Sie bearbeiten einfach die Dateien, die Sie benötigen, und checken sie ein. Beachten Sie, dass die eigentlichen Dateien auf einem zentralen Server gespeichert werden und jeder Benutzer die Software auch auf seinen eigenen Workstations ausführt. Dieser Speicherort auf dem Server wird als Repository bezeichnet.
Was passiert nun, wenn zwei Personen an der gleichen Datei in CVS/Subversion arbeiten? Sie werden zusammengeführt, normalerweise mit GNU diff und patch. diff' ist ein Dienstprogramm, das den Unterschied zwischen zwei Dateien extrahiert. patch' benutzt solche 'diff'-Dateien, um andere Dateien zu patchen.
Wenn Sie also in einer Funktion an WhateverController.java arbeiten und ich in einer anderen Funktion an der gleichen Datei, dann checken Sie sie einfach ein, wenn Sie mit Ihrer Arbeit fertig sind, und die Änderungen werden auf die Datei auf dem Server angewendet. In der Zwischenzeit hat meine lokale Kopie keine Ahnung von Ihren Änderungen, so dass sich Ihre Änderungen überhaupt nicht auf meinen Code auswirken. Wenn ich mit meinen Änderungen fertig bin, checke ich die Datei ebenfalls ein. Aber jetzt haben wir dieses scheinbar komplizierte Szenario.
Nennen wir das Original WhateverController.java, Datei A. Sie bearbeiten die Datei, und das Ergebnis ist Datei B. Ich bearbeite dieselbe Datei an einem anderen Ort, ohne Ihre Änderungen, und diese Datei ist Datei C.
Jetzt haben wir anscheinend ein Problem. Die Änderungen von Datei B und C sind beides Änderungen an Datei A. Also wird in einem lächerlich rückwärtsgewandten Junk wie SourceSafe oder Dreamweaver normalerweise die Änderung von Datei B überschrieben (weil sie zuerst eingecheckt wurde).
CVS/Subversion und vermutlich auch Git (über das ich so gut wie nichts weiß) erstellen Patches, anstatt Dateien einfach zu überschreiben.
Die Differenz zwischen den Dateien A und C wird erzeugt und zu Patch X. Die Differenz zwischen A und B wird erzeugt und zu Patch Y.
Dann werden die Patches X und Y auf die Datei A angewendet, so dass das Endergebnis die Datei A + die Änderungen an B und C auf unseren jeweiligen Arbeitsstationen ist.
Normalerweise funktioniert das einwandfrei. Manchmal arbeiten wir an der gleichen Funktion im gleichen Code. In diesem Fall wird CVS/Subversion den Programmierer auf ein Problem hinweisen und das Problem in der Datei selbst darstellen. Diese Probleme lassen sich in der Regel leicht beheben, zumindest hatte ich noch nie ein Problem mit ihnen. Grafische Hilfsprogramme wie Visual Studio, Project Builder (Mac OS X) und dergleichen zeigen in der Regel beide Dateien und die Konflikte an, so dass man auswählen kann, welche Zeilen man behalten und welche man wegwerfen möchte... und dann kann man die Datei auch manuell bearbeiten, wenn man den Konflikt manuell zusammenführen möchte.
Im Grunde genommen ist die Versionskontrolle also eine Lösung für das Problem, dass mehrere Personen an denselben Dateien arbeiten. Das ist im Grunde alles.
Ich hoffe, das erklärt alles.
EDIT: Es gibt noch viele andere Vorteile von vernünftigen Versionskontrollsystemen wie Subversion und vermutlich Git. Wenn es ein Problem gibt, kann man zu anderen Versionen zurückgehen, so dass man nicht alles manuell sichern muss. In der Tat, zumindest mit Subversion, wenn ich etwas vermassle oder einen Blick auf eine alte Version des Codes werfen will, kann ich das tun, ohne die Arbeit von jemand anderem zu stören.