056.2 Lektion 1
Zertifikat: |
Open Source Essentials |
---|---|
Version: |
1.0 |
Thema: |
056 Zusammenarbeit und Kommunikation |
Lernziel: |
056.2 Source Code Management |
Lektion: |
1 von 1 |
Einführung
Jeder, der schon einmal ein Textdokument im Team erstellt hat, kennt die Probleme einer solchen Zusammenarbeit: Welche Version ist die aktuelle? Wo ist diese Version gespeichert? Wird sie gerade von jemandem bearbeitet? Wer hat wann und warum welche Kommentare hinzugefügt oder Änderungen vorgenommen? Das Ergebnis sind oft unterschiedliche Versionen des Dokuments und im schlimmsten Fall eine Sammlung von Versionen, die niemand mehr überblickt.
Stellen Sie sich nun ein Softwareprojekt mit Hunderten von Dateien vor, an dem Entwickler aus der ganzen Welt arbeiten, indem sie neue Funktionen entwickeln, Fehler beheben, Teile abspalten und separat entwickeln usw. Ein solcher Entwicklungsprozess ist ohne geeignete Werkzeuge nicht mehr beherrschbar.
Spezielle Software für das Source Code Management (SCM), auch bekannt als Version Control Systems (Versionskontrollsysteme, VCS) oder Revision Control Systems (RCS), schafft hier Abhilfe und beseitigt die soeben skizzierten Probleme.
In der Welt der Softwareentwicklung ist SCM eine fundamentale Säule, die die Integrität der Codebasis schützt. Stellen Sie es sich als einen gewissenhaften Wächter vor, der jede Änderung am Quellcode im Laufe der Zeit akribisch verfolgt.
Source Code Management System und Repository
Das Source Code Management System ist das Herzstück eines Softwareprojekts. Obwohl wichtige Arbeiten in Diskussionsforen und an anderen Stellen stattfinden, repräsentiert das SCM-System sowohl die Geschichte des Projekts als auch seinen aktuellen Stand als dynamische Einheit.
Das Repository des Quellcodes ist eine Art digitale Werkstatt für ein Projekt: Wie in einer physischen Werkstatt alle Werkzeuge und Materialien aufbewahrt werden, die zur Herstellung eines Werkstücks benötigt werden, so sind in einem Source Code Repository alle Dateien, Dokumente und der Code des Softwareprojekts gespeichert. Es bietet eine strukturierte Umgebung für Organisation und Verwaltung der Projektressourcen.
Informationen werden in der Regel in Form eines Verzeichnisbaums gespeichert. SCM-Systeme setzen meist auf ein Client-Server-Modell, bei dem jeder Benutzer Daten aus dem Repository abrufen und in das Repository einpflegen kann. Das System zeichnet auf, wer wann welche Änderungen vorgenommen hat, und sorgt so für Transparenz und Verantwortlichkeiten innerhalb des Teams.
Stellen Sie sich vor, Sie arbeiten an einem Projekt mit mehreren Entwicklern und es wird ein Fehler im Code entdeckt. Mit einem SCM können Sie ganz einfach die Änderungen zwischen den Versionen untersuchen und die spezifische Änderung am Code ermitteln, die zu dem Fehler geführt hat.
Da sich das System jede Version einer Datei merkt, sobald sie sich ändert, hat ein Benutzer Zugriff auf jede dieser Versionen und kann zu früheren Versionen zurückkehren (falls beispielsweise falsche Änderungen vorgenommen wurden). Das Repository ist also auch eine Art Archiv, das Zugriff auf jede Änderung, die jemals an dem Projekt vorgenommen wurde, und auf den Status des Projekts zu jedem Zeitpunkt in seiner Geschichte gewährt.
SCM-Systeme sparen Platz, indem sie die Änderungen an einer Datei nachverfolgen, anstatt bei jeder Änderung die gesamte Datei zu speichern. Diese effiziente Speichermethode sorgt dafür, dass frühere Versionen zugänglich sind, ohne übermäßig viele Ressourcen zu verbrauchen.
Viele Tools, wie etwa Continuous Integration/Continuous Delivery (CI/CD) und Testing, sind eng mit dem SCM-System verbunden. Außerdem bauen die Mitwirkenden ihre Reputation über das System auf, indem sie ihre Beiträge für alle sichtbar machen. Bei der Verwaltung des Quellcodes geht es also nicht nur darum, Änderungen zu verfolgen, sondern auch darum, die Integrität der Codebasis zu bewahren und die Zusammenarbeit zwischen den Entwicklern zu fördern; so ist sichergestellt, dass sich Projekte dynamisch unter sich ständig verändernden Bedingungen weiterentwickeln können.
Beliebte SCM-Systeme sind Git, Subversion und CVS. Wie viele andere Softwarefunktionen wird SCM heute oft von spezialisierten Anbietern bereitgestellt. Mit anderen Worten, es handelt sich um Software as a Service (SaaS) oder einen “Cloud”-Dienst: Die Mitwirkenden haben die Software auf ihren lokalen Systemen, um ihre persönlichen Änderungen zu verwalten, laden ihre Änderungen aber in ein zentrales Repository hoch, das von typischen Cloud-Funktionen wie 24/7-Betriebszeit, Backups und sicherem Zugriff profitiert.
Millionen von Entwicklern nutzen inzwischen Cloud-Dienste, insbesondere GitHub. GitLab ist eine Alternative, die auf Open Source Code basiert. Sowohl GitHub als auch GitLab ermöglichen es, in den Cloud-Repositories des Anbieters zu arbeiten oder eine lokale Installation des SCM-Systems einzurichten. Ein Vorteil der Arbeit in diesen Systemen ist die Reputation, die man durch “Sterne” erwerben kann, indem andere Benutzer die eigene Arbeit bewerten. Cloud-Dienste bieten weitere Extras, wie Tracker für Änderungsanforderungen, Bewertungssysteme, Wikis und Diskussionsforen.
Repositories können sowohl persönliche als auch Unternehmensprojekte enthalten, sie sind also keineswegs auf ein kommerzielles Umfeld beschränkt. Jeder Entwickler, der ein Projekt starten oder an einem Open-Source-Projekt arbeiten und es nach seinen Bedürfnissen kopieren und verändern möchte, kann dies tun. In all diesen Fällen ist es wichtig, genau zu kontrollieren, wer auf das Repository zugreifen darf.
Um sich in der Versionskontrolle und dem Source Code Management zurechtzufinden, ist es wichtig, die Begrifflichkeiten zu kennen. In den folgenden Abschnitten werden wir darum einige dieser Konzepte und Begriffe klären.
Commits, Tags und Branches
Ein Entwickler erstellt jedes Mal einen Commit, wenn er eine Änderung in das Respository überträgt. Commits stellen Momentaufnahmen von Änderungen dar, die zu einem bestimmten Zeitpunkt an der Codebasis vorgenommen wurden. Jeder Commit enthält Metadaten wie den Namen des Autors, einen Zeitstempel und eine beschreibende Nachricht, die die Änderungen erläutert. Commits helfen Entwicklern, die Entwicklung der Codebasis nachzuverfolgen und die Geschichte bestimmter Änderungen zu verstehen.
Stellen Sie sich ein Team von Entwicklern vor, die an einer Webanwendung arbeiten. Jedes Mal, wenn sie Änderungen an der Codebasis vornehmen, erstellen sie einen Commit, um diese Änderungen zu dokumentieren. Zum Beispiel könnte jemand, der eine neue Funktion zur Anwendung hinzufügt, einen Commit mit einer Nachricht wie “Funktion zur Benutzerauthentifizierung hinzugefügt” erstellen. Dieser Commit erfasst den Zustand der Codebasis, nachdem die Funktion implementiert wurde.
Behebt ein Entwickler einen Fehler, bezieht sich die Commit-Nachricht normalerweise auf die Nummer des Fehlers im Bug Tracking System, der Fehlerdatenbank, des Projekts.
Tags sind benannte Verweise auf bestimmte Commits. Sie markieren typischerweise wichtige Punkte in der Projektgeschichte, wie beispielsweise Releases oder Milestones. Tags bieten eine Möglichkeit, wichtige Versionen der Codebasis zu kennzeichnen und darauf zu verweisen, was die Verwaltung und Navigation in der Projektgeschichte erleichtert.
Branches, also Zweige oder Abzweigungen, kommen ins Spiel, wenn Entwickler gleichzeitig an sich überschneidenden Aufgaben arbeiten müssen. Branches sind unabhängige Entwicklungslinien, die von der Hauptcodebasis abweichen. So können Entwickler isoliert an Funktionen oder Korrekturen arbeiten, ohne den Hauptcode zu beeinflussen, bis die Änderungen für die Integration bereit sind. Branches helfen, die Entwicklungsarbeit zu organisieren, und erleichtern die Zusammenarbeit zwischen den Teammitgliedern.
Wenn zum Beispiel ein Entwickler an einer neuen Funktion für die Anwendung arbeitet, während ein anderer einen Fehler behebt, kann jeder von ihnen einen eigenen Branch erstellen, um die Änderungen zu isolieren. Sobald ihre Arbeit abgeschlossen ist, können sie ihre Zweige wieder in der Hauptcodebasis zusammenführen, was als Merge bezeichnet wird (Branches).

Wenn mehrere Personen an der gleichen Datei arbeiten oder Dateien in einen anderen Branch überführen, kann es vorkommen, dass sie Änderungen an derselben Zeile einer Datei vornehmen. Wenn die zweite Person ihre Änderungen wieder zurück in das Projekt zu übertragen versucht, meldet das System einen Konflikt.
Einige Versionskontrollsysteme lassen es nicht zu, dass ein Entwickler eine Datei eincheckt, solange sie in Konflikt mit der aktuellen Version im Repository steht. Der Entwickler muss dann die aktuelle Version auschecken, den Konflikt lösen und eine neue Version einchecken.
Cloud-basierte Systeme bieten Merge oder Pull Requests. Diese werden von einem Entwickler erstellt, der in einem lokalen System oder Branch gearbeitet hat und glaubt, dass seine Änderungen für die Aufnahme in einen anderen Branch geeignet sind. Die Entwickler des Zielzweigs entscheiden dann, ob sie die Anfrage annehmen.
Subrespositories
Oft wird für die Entwicklung eines Softwareprojekts (beispielsweise eine komplexe Website) der Code eines anderen, unabhängigen Projekts (etwa ein Mediaplayer) benötigt. Statt den Code des Mediaplayers ganz oder teilweise in das eigene Projekt zu kopieren, bieten viele VCS die Möglichkeit von Subrepositories, auch Submodule genannt.
In unserem Beispiel wird das Repository des Mediaplayers als Subrepository in das Repository der Website integriert und erscheint dann als separates Verzeichnis im Verzeichnisbaum. Das bedeutet, dass die Codebasis des Mediaplayers vollständig verfügbar ist, aber unabhängig bleibt und bei Bedarf sogar aus dem ursprünglichen Repository des Mediaplayers aktualisiert werden kann.
Dieses Feature erweist sich bei der Organisation komplexer Projekte mit zahlreichen Abhängigkeiten oder der Integration von Bibliotheken und Frameworks von Drittanbietern in eine Codebasis als überaus hilfreich. Submodule verbessern die Projektorganisation und erleichtern die Zusammenarbeit, indem sie Entwicklern die Möglichkeit geben, effizient mit dem Code verschiedener (Teil-)Projekte zu arbeiten.
Verwendung eines Source Code Management Systems
Jeder Mitwirkende an einem Projekt beginnt mit der Erstellung einer Identität, die in der Regel mit seiner eindeutigen E-Mail-Adresse verknüpft ist. Cloud-basierte Systeme verwalten Identitäten über Konten, wie es auch Social Media Sites und andere Organisationen tun.
Neue Entwickler durchlaufen eine Prozedur wie die folgende, wenn sie ein SCM-System verwenden:
-
SCM-Software installieren, wenn sie nicht bereits auf dem eigenen System vorhanden ist.
-
Das gesamte Projekt einmalig auf das lokale System übertragen — ein Vorgang, der als Klonen bezeichnet wird.
-
Ab diesem Schritt lokal arbeiten (ggf. in einem oder mehreren Branches) und Änderungen in das Repository übertragen (Push).
-
Vor jeder neuen Arbeitssitzung die aktuelle Version aus dem Repository holen (Pull).
Die Projektleiter entscheiden, wem sie vertrauen und Zugang zum Repository gewähren. Senior Developer haben die wichtige Aufgabe zu entscheiden, wann die von anderen Mitwirkenden eingereichten Änderungen in den Hauptzweig des Repositorys aufgenommen werden.
In Cloud-basierten Systemen kann der Owner eines Projekts den Zugang zu einem Repository auch dadurch steuern, dass er dessen Sichtbarkeit auf “öffentlich” oder “privat” einstellt. Öffentliche Repositories gewähren jedermann Lesezugriff über das Internet. Private Repositories hingegen beschränken den Zugriff auf den Eigentümer, auf Personen, für die der Eigentümer den Zugriff ausdrücklich freigegeben hat, und im Falle von Organisations-Repositories auf bestimmte Mitglieder der Organisation.
Stellen Sie sich ein Team von Entwicklern vor, die an einer E-Commerce-Website arbeiten. Sie beschließen, eine neue Funktion hinzuzufügen, über die Kunden ihre Bestellungen nachverfolgen können. Um diese Funktion zu implementieren, erstellen sie einen Feature Branch mit einem Namen wie order-tracking
; darin nehmen sie die notwendigen Änderungen im Code vor, ohne die Hauptcodebasis zu ändern. Sobald die Funktion fertiggestellt und getestet ist, fügen sie diesen Branch in den Hauptentwicklungszweig (Development Branch) für weitere Integration und Tests ein.
Der Hauptentwicklungszweig dient als zentraler Knotenpunkt, in dem alle neuen Funktionen zum Testen zusammengeführt werden. Wenn beispielsweise mehrere Entwickler gleichzeitig an verschiedenen Funktionen arbeiten, können sie ihre Feature Branches mit dem Development Branch zusammenführen, um sicherzustellen, dass alles reibungslos funktioniert. Dieser Integrationsprozess hilft dabei, etwaige Konflikte oder Kompatibilitätsprobleme frühzeitig zu erkennen und zu beheben.
Wenn es an der Zeit ist, eine neue Version der E-Commerce-Website freizugeben, erstellt das Team aus dem Development Branch einen Release Branch, beispielsweise v2.0
. Sie konzentrieren sich darauf, die Codebasis zu stabilisieren, letzte Fehler zu beheben und gründliche Tests durchzuführen, um eine reibungslose Veröffentlichung zu gewährleisten. Ist die Freigabe erteilt, wird der Code aus dem Release Branch in die produktiven Systeme ausgeliefert (Deploy), und der Zyklus beginnt von neuem.
Bekannte Versionskontrollsysteme
Einige der bekanntesten Versionskontrollsysteme sind Git, Subversion (auch bekannt als SVN) und CVS. All diese Systeme sind Open Source.
Git ist ein verteiltes Versionskontrollsystem, das in der Softwareentwicklung und anderen Bereichen weit verbreitet ist. Bei der Arbeit mit Git hat jeder Entwickler eine vollständige Kopie der Codebasis auf seinem Computer.
Der dezentrale Ansatz ermöglicht es den Entwicklern, offline zu arbeiten und nahtlos zusammenzuarbeiten, ohne auf einen zentralen Server angewiesen zu sein. Das heißt, sie können unabhängig voneinander an verschiedenen Funktionen oder Fehlerbehebungen arbeiten sowie Änderungen nahtlos zusammenführen oder Updates untereinander austauschen, selbst wenn der zentrale Server offline geht.
Erinnern Sie sich an die Entwicklung des Linux-Kernels, der ursprünglich auf ein zentralisiertes Versionskontrollsystem namens BitKeeper angewiesen war. Als der kostenlose Status von BitKeeper aufgehoben wurde, entwickelten Linus Torvalds und die Linux Community Git als verteilte Alternative. Diese Entscheidung machte eine nicht-lineare und hoch effiziente Entwicklung großer Projekte wie des Linux-Kernels erst möglich. Der Erfolg von Git für den Linux-Kernel — ein extrem komplexes Projekt mit Tausenden von Entwicklern und unzähligen Branches — zeigt die Leistungsfähigkeit und Skalierbarkeit des Systems.
Die meisten Softwareentwickler setzen heute auf Git, und auch beliebte SaaS-Angebote bauen darauf auf.
Git behandelt Konflikte, indem es dem Entwickler eine Datei mit beiden Versionen der geänderten Zeile zeigt und deutlich markiert, aus welcher Version der Datei die Zeilen stammen. Der Entwickler muss entscheiden, wie er den Konflikt auflöst und eine kohärente Version der Datei eincheckt.
Subversion (SVN) war vor Git das wahrscheinlich populärste SCM-System. Im Gegensatz zu Git ist Subversion zentralisiert: Die Versionsgeschichte liegt auf einem zentralen Server. Die Entwickler verbinden sich mit diesem Server, um Änderungen vorzunehmen, wodurch sichergestellt wird, dass jeder mit der neuesten Version der Codebasis arbeitet.
Angenommen Sie sind Teil eines Teams, das an einem Projekt mit Subversion arbeitet. Jedes Mal, wenn Sie Änderungen an der Codebasis vornehmen müssen, stellen Sie eine Verbindung zum zentralen SVN-Server her, um eine Arbeitskopie des Codes auszuchecken. So stellen Sie sicher, dass Sie mit der aktuellsten Version des Projekts arbeiten. Nachdem Sie Ihre Änderungen vorgenommen haben, übertragen Sie sie zurück auf den Server und aktualisieren das zentrale Repository mit Ihren Änderungen. Dieser zentralisierte Arbeitsablauf trägt dazu bei, die Konsistenz des Projekts zu wahren.
Vor Subversion war CVS ein sehr beliebtes, zentralisiertes Versionskontrollsystem, das aber Designprobleme hatte, die zur Entwicklung von Subversion als Alternative führten.
Geführte Übungen
-
Nennen Sie drei Hauptmerkmale von SCM-Systemen.
-
Beschreiben Sie das Konzept des Tagging in SCM-Systemen und erklären Sie, warum es für die Verwaltung von Software Releases wichtig ist.
-
Was ist der Unterschied zwischen einem Branch und einem Subrepository in einem SCM-System?
Offene Übungen
-
Vergleichen Sie Git und Subversion (SVN) in Bezug auf Architektur und Arbeitsabläufe.
-
Was ist der “Index” oder die “Staging Area” in Git?
-
Skizzieren Sie die Trunk-basierte Verzweigungsstrategie von Git.
-
Welche der folgenden SCM-Systeme sind Open Source?
Git
Mercurial
Subversion
GitHub
Bitbucket
GitLab
Zusammenfassung
In dieser Lektion ging es um die zentrale Rolle von Source Code Management Systemen in der modernen Softwareentwicklung. Sie haben die grundlegenden Begriffe und Möglichkeiten der Nutzung solcher Systeme kennengelernt, einschließlich Repository, Branches, Tags und Merges.
Antworten zu den geführten Übungen
-
Nennen Sie drei Hauptmerkmale von SCM-Systemen.
-
Änderungen am Quellcode protokollieren
-
(Gleichzeitigen) Zugriff der Entwickler auf den Quellcode verwalten
-
Beliebigen Entwicklungsstand von Dateien oder des gesamten Projekts wiederherstellen
-
-
Beschreiben Sie das Konzept des Tagging in SCM-Systemen und erklären Sie, warum es für die Verwaltung von Software Releases wichtig ist.
Unter Tagging versteht man das Zuweisen von beschreibenden Bezeichnungen oder Namen zu bestimmten Commits innerhalb der Codebasis, um wichtige Punkte in der Projektgeschichte zu markieren, beispielsweise Releases oder Milestones. Diese Tags bieten eine bequeme Möglichkeit, auf bestimmte Versionen der Codebasis zu verweisen und die Entwicklung des Projekts im Laufe der Zeit nachzuverfolgen.
-
Was ist der Unterschied zwischen einem Branch und einem Subrepository in einem SCM-System?
Ein Branch ist eine parallele Entwicklungslinie in einem Projekt, etwa zur Fehlerbehebung oder zur Entwicklung neuer Funktionen, die in der Regel wieder in den Hauptentwicklungszweig eingebunden wird, sobald die Aufgabe abgeschlossen ist. Ein Subrepository oder Sumbmodul ist ein unabhängiges Projekt, dessen Repository in ein Projekt integriert wird, um auf dessen Codebasis zugreifen zu können. Das Subrepository erscheint als Verzeichnis im Verzeichnisbaum des Projekts und bleibt unabhängig.
Antworten zu den offenen Übungen
-
Vergleichen Sie Git und Subversion (SVN) in Bezug auf Architektur und Arbeitsabläufe.
Git ist ein verteiltes Versionskontrollsystem (Distributed Version Control System, DVCS), das jedem Entwickler eine vollständige Kopie der Codebasis überlässt und ihm ermöglicht, sogar offline am Quellcode zu arbeiten. Git ist aufgrund seiner Geschwindigkeit, Flexibilität und robusten Branch- und Merge-Funktionen sehr beliebt. SVN ist ein zentralisiertes VCS, das den Versionsverlauf auf einem zentralen Server speichert. In bestimmten Unternehmensumgebungen ist es aufgrund der zentralisierten Struktur und seines ausgereiften Funktionsumfangs nach wie vor beliebt.
-
Was ist der “Index” oder die “Staging Area” in Git?
Der Index oder Staging-Bereich ist eine Zwischenschicht zwischen der lokalen Arbeitskopie des Projekts und der aktuellen Version auf dem Server. Es handelt sich um eine Datei, in der alle Informationen für den nächsten Commit eines Benutzers gespeichert sind.
-
Skizzieren Sie die Trunk-basierte Verzweigungsstrategie von Git.
Die Trunk-basierte Entwicklung ist eine Strategie, bei der die häufige Integration von Änderungen in die Hauptcodebasis (den Trunk) im Vordergrund steht. Entwickler arbeiten an kurzlebigen Feature Branches und führen sie gegebenenfalls mehrmals am Tag in den Trunk ein, um kontinuierliche Integration und schnelles Feedback zu gewährleisten.
-
Welche der folgenden SCM-Systeme sind Open Source?
Git
X
Mercurial
X
Subversion
X
GitHub
Bitbucket
GitLab
X