Einige grundsätzliche Fragen zur Versionsverwaltung mit Git sind der Inhalt der sechsundsiebzigsten Episode des Anwendungsentwickler-Podcasts.
TL;DR
Ich führe dich als IT-Azubi in die Grundlagen von Git ein, damit du Änderungen an deinem Quellcode nachvollziehen und gespeicherte Stände wiederherstellen kannst. Git hält die Projekthistorie lokal vor, wodurch du auch offline arbeiten und eigene Commits vor dem Teilen korrigieren kannst. Du erfährst, wie Repository und Arbeitskopie zusammenhängen, wie du mit git clone und git pull einsteigst und welche Informationen zu einem Commit gehören.
Podcast: Play in new window | Download (Duration: 37:10 — 17.5MB)
Abonnieren: Apple Podcasts | Spotify | RSS
Kapitelmarken
- [00:00:01] Einführung in Git
- [00:00:33] Fragen zum Selbstlernen und Material zum Herunterladen
- [00:01:57] Git in der Ausbildung und im Betrieb
- [00:03:14] Tutorials und weiterführende Lernangebote
- [00:04:58] Allgemeine Grundlagen und betriebliche Fragen
- [00:06:14] Wozu Versionsverwaltung dient
- [00:07:55] Gespeicherte Stände und Änderungen nachvollziehen
- [00:11:09] Subversion als zentrale Versionsverwaltung
- [00:12:01] Lokal und offline mit Git arbeiten
- [00:14:10] Eigene Versionen korrigieren und lauffähige Stände teilen
- [00:16:11] Repository und der Ordner .git
- [00:19:44] Ein Repository mit git clone kopieren
- [00:23:06] Die Arbeitskopie und ältere Stände auschecken
- [00:25:42] Änderungen mit git pull holen
- [00:27:49] Commits und ihre Kennung
- [00:29:09] Hashes als Prüfsummen und Commit-IDs
- [00:31:45] Angaben im Commit und Parent-Commits
- [00:33:45] Weitere Fragen und Fortsetzung der Git-Einführung
- [00:34:58] Podcast-Empfehlung Together We Make IT
- [00:36:01] Git für eigene Projekte und Texte
Inhalt
Allgemeine Fragen
- Wofür braucht man eine Versionsverwaltungssoftware?
- Was sind die Vorteile einer Versionsverwaltungssoftware?
- Was ist SVN?
- Was ist Git?
- Was sind die Vorteile von Git gegenüber SVN?
- Was ist ein Repository?
- Welche Befehle musst du ausführen, um dir ein Repository zu klonen?
- Was ist eine Arbeitskopie?
- Welche Befehle musst du ausführen, um deine Arbeitskopie aus einem entfernten Repository zu aktualisieren?
- Was ist ein Commit?
Literaturempfehlungen
Links
Zusammenfassung
Git in deiner IT-Ausbildung
Für meine IT-Azubis habe ich Fragen zusammengestellt, die du mithilfe eines Tutorials selbst bearbeitest und anschließend mit meinen Antworten abgleichst. Dabei geht es um die Grundlagen von Git sowie um Regeln, die du für die Arbeit in deinem Ausbildungsbetrieb kennen musst. Versionsverwaltung gehört zum Handwerkszeug als Fachinformatiker:in Anwendungsentwicklung und ist auch für die Prüfung relevant.
Ich arbeite bei neuen Projekten mit Git und verwalte damit auch eigene Texte. In meinem Betrieb kommt Git für die meisten Repositories zum Einsatz; einige ältere Projekte liegen noch in Subversion.
Dateien versionieren und Änderungen nachvollziehen
Wenn du an einem Programm weiterarbeitest, kannst du einzelne Stände in einer Versionsverwaltung speichern und später wiederherstellen. Die Historie zeigt dir, welche Person eine Datei zu welchem Zeitpunkt verändert hat. Eine aussagekräftige Commit-Nachricht hält außerdem fest, warum etwas geändert wurde.
- Änderungen ansehen: Ein Diff zeigt die Unterschiede zwischen zwei Ständen. Bei Textdateien lassen sich hinzugefügte oder entfernte Zeilen gezielt erkennen, etwa wenn ich einen Text von dir korrigiere.
- Zu einem gespeicherten Stand zurückkehren: Falls du beim Ausprobieren eine Datei löschst oder dein Programm beschädigst, kannst du einen früheren Stand wiederherstellen.
- Fehler untersuchen: Über die Historie findest du heraus, wer eine betroffene Codezeile zuletzt bearbeitet hat und in welchem Zusammenhang das passiert ist.
- Quellcode im Browser ansehen: Über eine passende Weboberfläche kannst du Dateien und ihre Änderungen durchgehen.
Textdateien eignen sich besonders gut zum Versionieren, weil sich ihre Unterschiede zeilenweise darstellen lassen. Auch Bilder und andere binäre Dateien können verwaltet werden, wobei neue Stände mehr Speicherplatz beanspruchen können.
Wie Subversion und Git arbeiten
Subversion
Bei Subversion, kurz SVN, liegt das Repository auf einem zentralen Server. Du bearbeitest deine Dateien lokal und überträgst einen fertigen Stand an diesen Server, der die neue Version mit den zugehörigen Angaben speichert. Für solche Schritte muss der Server erreichbar sein.
Die gespeicherten Versionen heißen Revisionen und erhalten fortlaufende Nummern.
Git
Mit Git liegt die gesamte Projekthistorie auf deiner Festplatte. Dadurch kannst du offline neue Versionen erzeugen und frühere Änderungen ansehen. Viele Arbeitsschritte laufen lokal und entsprechend schnell ab.
Solange du eigene Commits noch mit niemandem geteilt hast, kannst du sie korrigieren, beispielsweise wenn du eine Datei vergessen hast. Für die Zusammenarbeit lässt sich dein lokales Repository mit einem entfernten Remote-Repository abgleichen. Dort liegen deine Daten zusätzlich außerhalb deines Rechners.
Bevor du einen Stand mit Kolleg:innen teilst, sollte das Programm lauffähig und zumindest kompilierbar sein, damit sie damit weiterarbeiten können.
Repository und Arbeitskopie
Im Repository, häufig kurz Repo genannt, speichert Git die Versionen deines Projekts samt Historie. Du kannst es dir als Datenbank vorstellen. Lokal liegen diese Informationen im Ordner .git innerhalb deines Projektverzeichnisses. Wenn du diesen Ordner löschst oder seinen Inhalt von Hand veränderst, kannst du deine lokale Historie verlieren oder beschädigen. Lass Git diesen Ordner verwalten.
In der Arbeitskopie liegen die Dateien eines konkreten Stands, die du im Editor öffnest und bearbeitest. Nach dem Klonen stellt Git normalerweise den aktuellen Stand bereit. Du kannst auch eine ältere Version auschecken, etwa um dort einen Fehler zu untersuchen oder einen Patch einzuspielen.
Wenn du Dateien in deiner Arbeitskopie bearbeitest, musst du die Änderungen anschließend ausdrücklich als neue Version im Repository speichern.
Ein vorhandenes Projekt holen
Mit git clone <URL> kopierst du ein vorhandenes Repository auf deinen Rechner. Die Adresse kann beispielsweise auf einen lokalen Pfad oder auf ein Repository zeigen, das über HTTPS beziehungsweise SSH erreichbar ist. Welche Adresse und welchen Zugang du brauchst, klärst du in deinem Ausbildungsbetrieb.
Beim normalen Klonen erhältst du die vollständige Historie des entfernten Repositories und eine Arbeitskopie, in der du direkt weiterarbeiten kannst. Bei großen Projekten dauert das Herunterladen entsprechend länger.
Neue Änderungen holen
Wenn Kolleg:innen neue Stände im Remote-Repository bereitgestellt haben, holst du sie mit git pull. Im beschriebenen einfachen Fall, in dem du zwischenzeitlich selbst nichts geändert hast, gelangen die neuen Versionen in dein lokales Repository und deine Arbeitskopie wird aktualisiert.
Mit Push überträgst du eigene Versionen an ein Remote-Repository, um sie dort bereitzustellen.
Was zu einem Commit gehört
Eine gespeicherte Version heißt bei Git Commit. Zu ihr gehören:
- der gespeicherte Stand der Dateien,
- die Angaben zum/zur Autor:in und der Zeitpunkt,
- die Commit-Nachricht,
- der Bezug zum vorherigen Commit, dem Parent-Commit.
Ein Commit kann auch zwei Parent-Commits haben. Dieses Thema folgt später.
Git berechnet aus den zugehörigen Informationen einen Hash, der als Commit-ID dient. Eine Hashfunktion erzeugt aus Daten variabler Länge einen Wert fester Länge, der sich als Prüfsumme verwenden lässt. Schon kleine Änderungen an den Ausgangsdaten führen bei einem geeigneten Verfahren zu einem deutlich anderen Hash.
Die Commit-ID wird hexadezimal dargestellt. Um die zeitliche Reihenfolge der Commits nachzuvollziehen, brauchst du die Historie und die Beziehungen zu den Parent-Commits. Über die ID kannst du einen gespeicherten Commit gezielt aufrufen.
Material zum Selbstlernen
In meinen Shownotes zur Episode 76 findest du die Fragen und weiterführende Links. Über meinen Newsletter erhältst du die Fragen auch als Markdown-Datei zum Bearbeiten oder Ausdrucken.
- Java Code Geeks: Das kostenlose Git-Tutorial umfasst ungefähr 40 Seiten und enthält Beispiele zum Mitmachen.
- Pro Git von Scott Chacon: Das Buch ist als kostenloses E-Book und als gedruckte Ausgabe erhältlich.
- Pluralsight: Ich verweise auf einen Einstiegskurs und erwähne einen weiteren Kurs zu den internen Abläufen von Git.
Die weiteren Fragen folgen in einer nächsten Episode. Dazu gehören auch betriebliche Konventionen und der Zugang zu den Repositories deines Ausbildungsbetriebs.
Für weitere IT-Grundlagen empfehle ich Together We Make IT. Dort werden unter anderem Firewall und Cloud Computing verständlich behandelt. Die Folgen dauern meist etwa 20 bis 30 Minuten und enthalten Begriffe, die dir auch bei der Abschlussprüfung begegnen.
Transkription der gesamten Episode
Automatisch erzeugte Transkription der Episode
Herzlich Willkommen zum Anwendungsentwickler-Podcast, den Podcast rund um die Ausbildung zum Fachinformatiker für Anwendungsentwicklung.
In dieser Episode gibt es eine Einführung in die Versionsverwaltungssoftware Git. Viel Spaß dabei!
Hallo und herzlich Willkommen zur 76. Episode des Anwendungsentwickler-Podcasts.
Mein Name ist Stefan Macke und heute mache ich mal was Neues, was ich bislang noch nicht gemacht habe hier im Podcast.
Ich habe nämlich mal mir ein fachliches Thema vorgenommen und zwar Git, die Versionsverwaltungssoftware Git, die du vielleicht sogar schon kennst oder ich hoffe es mal, ist ja sehr verbreitet heutzutage.
Und ich habe mir mal so ein paar Fragen dazu aufgeschrieben, die ich vor ein, zwei Wochen meinem aktuellen Azubi mitgegeben habe,
damit er sich mal mit einem Tutorial, was ich ihm gleich mitgeschickt habe, so ein bisschen darauf vorbereitet, quasi selbst so ein bisschen recherchiert, ausprobiert, das Ding abarbeitet und dann mir die Fragen beantwortet.
Und diese Fragen habe ich auch zum Download auf meinem Blog zur Verfügung gestellt.
Wenn du sie dir runterladen willst, musst du dich allerdings für mein Newsletter anmelden unter www.anwendungsentwickler-podcast.de slash Newsletter kannst du das tun.
Wenn du schon angemeldet bist, noch besser, kannst du natürlich auch runterladen, dann kennst du den Link schon oder du hast ihn jetzt auch im aktuellen Newsletter nochmal von mir zugeschickt bekommen.
Du kannst aber auch einfach auf die Website so gehen, auf die Shownotes zu dieser Episode unter www.anwendungsentwickler-podcast.de slash 76, also die 76 für die heutige 76. Episode.
Und da findest du die Fragen auch nochmal. Du kannst sie dir aber auch im Markdown-Format zum selber ändern, ausdrucken, wie auch immer, runterladen, wie gesagt, wenn du bei meinem Newsletter angemeldet bist.
Die Fragen habe ich mal zusammengestellt. Das sind so meiner Meinung nach so erstmal so ein paar zentrale Sachen, die man wissen muss, wenn man mit Git arbeiten will.
Und ich habe eben einfach mal die Aufgabe gegeben, hier guck dir mal das Tutorial an, such mal ein bisschen im Internet, arbeite mal so ein paar Antworten aus für die Fragen.
Und wir haben uns die dann im Anschluss gemeinsam angeguckt und so eine kleine Lernzielkontrolle daraus gemacht.
Und das Ganze packe ich jetzt mal hier in den Podcast, weil ich finde, dass Git ein sehr wichtiges Werkzeug ist.
Nicht unbedingt ganz konkret jetzt Git, aber eine Versionsverwaltung allgemein, sage ich mal.
Nur wenn man heute mit irgendwas anfängt, dann würde ich doch ganz stark Git empfehlen, weil es einfach so dominant ist und so verbreitet.
Also ich kenne fast niemanden, der nicht mit Git arbeitet, nur noch mit irgendwelchen anderen Systemen, außer vielleicht im .NET-Umfeld.
Wenn man jetzt wirklich hardcore Microsoft-Sachen macht, da ist es dann vielleicht eher der Team Foundation Server, wo nochmal Versionskontrolle drin ist.
Einige Leute benutzen auch noch Subversion, einfach weil es etabliert ist und weil es seit Jahren zum Beispiel im Einsatz ist.
Aber wenn ich jetzt irgendwelche neuen Sachen starte und auch gerade ich persönlich, ich benutze für alles eigentlich nur noch Git.
Und auch auf der Arbeit haben wir eigentlich Git für alle unsere Repos im Einsatz.
Außer noch so ein paar ganz alte SVN-Sachen, die der Fachbereich benutzen soll, weil Git zugegebenermaßen, wenn man damit einsteigt, nicht das einfachste Tool ist.
Ist ein bisschen, ja man könnte schon fast sagen, ein bisschen kompliziert am Anfang.
Deswegen auch genau diese Episode, um mal so ein paar Grundsatzfragen zu klären, damit man eben mit Git vielleicht arbeiten kann.
Und vielleicht auch dieses Thema, was auch durchaus relevant ist für die Prüfung, dann irgendwie mal angehen kann.
Ich hoffe, es ist ein bisschen was für dich dabei.
Vielleicht kennst du Git schon, dann ist es vielleicht so eine kleine Wiederholung oder Vertiefung.
Vielleicht kennst du noch nicht alle Begriffe, die wir heute durchgehen.
Wenn du Git noch nicht kennst, nimm das als Ansatz, um es dir dringend mal anzuschauen.
Ich habe auch in den Shownotes und auch in den Fragenlisten, die man runterladen kann, wie gerade erwähnt, auch noch ein paar kostenfreie Ressourcen hinzugefügt.
Also gerade zu einem Tutorial, was ich auch benutzt habe, was mein Azubi sich durchlesen sollte.
Das ist von Java Code Geeks.
Vielleicht kennst du die Seite auch schon.
Das ist eine tolle Seite mit ganz vielen coolen Ressourcen rund um die Java-Entwicklung.
In diesem Fall gibt es auch ähnlich noch für andere Sprachen.
Aber ich habe das Ding auf jeden Fall abonniert.
Und da habe ich dieses Git-Tutorial halt gefunden.
Das ist ein kostenfreies E-Book um die 40 Seiten.
Und es sind alle wichtigen Sachen drin erklärt.
Und man kann es auch gleich direkt mitmachen, sage ich mal.
Von daher habe ich Ihnen das jetzt mal empfohlen.
Und das hat meiner Meinung nach jetzt erstmal ganz gut geklappt.
Die Leerzieh-Kontrolle hat ganz gut funktioniert.
Und die meisten Sachen konnte er gut beantworten.
Von daher habe ich das einfach in die Shownotes reingepackt.
Ja doch, in den Shownotes auch.
Da kannst du auch direkt auf die Links gehen und dir die Sachen angucken.
Oder dir halt die Liste darunter laden.
Da sind auf jeden Fall die Links auch noch drin.
Zusätzlich habe ich natürlich auch noch das super Buch überhaupt dazu.
Nämlich quasi vom Erfinder, kann man nicht sagen.
Aber von einem Git-Benutzer oder Entwickler der ersten Stunde.
Von Scott Chacon spricht man ihn glaube ich aus.
Das Pro-Git gibt es als kostenfreie E-Book-Variante zum Download.
Gibt es aber auch als gedruckte Variante.
Ich habe beides auf jeden Fall in den Shownotes verlinkt.
Und wenn du bei Pluralsight zum Beispiel unterwegs bist, gibt es da auch super coole Git-Kurse.
Ich habe mal so einen Einstiegskurs verlinkt, direkt in den Shownotes.
Es gibt aber auch noch einen, der jetzt 2016 erst rausgekommen ist.
Den konnte ich noch nicht verlinken.
Der behandelt, sage ich mal, richtig die Interna von Git.
Wie das ganz konkret auf Dateisystem-Ebene funktioniert und wie diese Hashes berechnet werden.
Und also wirklich die krassen Interna von Git.
Das fand ich sehr, sehr, sehr interessant.
Also wenn du da zufällig schon Abonnent bist, guck da unbedingt mal rein.
Da gibt es echt super gute Videos zum Thema.
Okay, wir fangen einfach mal an mit den Fragen, die ich mir jetzt zu der Einführung in Git ausgedacht habe.
Also wie gesagt, ich nehme das jetzt dann in Zukunft für meine nächsten Azubis.
Gebe denen die Liste und die sollen selber recherchieren und das bearbeiten.
Ich glaube, dann hat man erstmal einen ganz guten Einstieg in Git.
Und ich habe das jetzt mal so ein bisschen aufgeteilt in zwei Bereiche.
In einen großen allgemeinen Bereich rund um Git und die Versionsverwaltung.
Und dann habe ich noch ein paar Fragen zusätzlich dazu, die für das Unternehmen interessant sind.
Denn nur weil man jetzt Git anwenden kann, heißt das noch lange nicht, dass ich Git auch in meinem Unternehmen anwenden kann.
Denn es gibt vielleicht noch mal so ein paar Konventionen oder Sachen, die man einfach wissen muss,
um dann auch im eigenen Unternehmen mit Git oder einer anderen Versionsverwaltung vernünftig arbeiten zu können.
Und die Fragen gehen wir dann am Ende auch noch mal kurz durch.
Okay, ich beantworte die Fragen jetzt mal nicht super, mega detailliert.
Denn ich versuche mal wieder, mich an die halbe Stunde zu halten.
Gucken wir mal, ob ich das hinkriege.
Und es soll halt keine riesen Leerzickertrolle werden,
sondern die Idee dahinter ist ja eigentlich, dass man sich selber mit dem Thema auseinandersetzt.
Und wenn du das vielleicht tun willst und dich erstmal selber damit beschäftigen willst,
dann kannst du gerne die Episode hier mal kurz pausieren.
Schaust dir das Tutorial an, bearbeitest das mal und kommst dann vielleicht wieder
und hörst dir meine Antworten auf die Fragen an.
Dann weißt du auch gleich, ob du es richtig verstanden hast oder nicht.
Wäre eine Möglichkeit, wenn du das machen möchtest.
Drück einfach jetzt auf Pause.
Ansonsten fangen wir jetzt an mit den Fragen.
Nummer eins auf meiner Liste.
Wofür braucht man überhaupt eine Versionsverwaltungssoftware?
Es gibt verschiedene Software da draußen, die Versionsverwaltung anbietet.
Ich habe schon gesagt Git.
Es gibt Subversion SVN abgekürzt.
Es gibt den Team Foundation Server.
Es gibt den Vorgänger von SVN, das CVS.
Es gibt Mercurial, das so ähnlich ist wie Git und so weiter.
Es gibt ganz verschiedene Möglichkeiten, wie man Versionsverwaltung betreiben kann.
Die zentrale Frage ist, wofür brauche ich das überhaupt?
Eigentlich ist es ganz egal, was für ein Tool man benutzt.
Ich glaube, als Softwareentwickler kommt man nicht drum herum,
unbedingt Versionsverwaltung zu benutzen.
Die Frage ist jetzt aber, warum?
Warum ist das so wichtig?
Also eine Versionsverwaltungssoftware, wie der Name eigentlich schon sagt,
verwaltet Versionen von irgendwelchen Dateien.
Als Entwickler sind das halt meistens Source-Code-Dateien.
Das muss aber nicht so sein.
Ich kann auch andere Textdateien, was weiß ich, meine Word-Dokumente,
meine Bilder, wie auch immer.
Alles, wovon es vielleicht in Zukunft mehrere Versionen geben wird,
kann ich damit verwalten.
Mehr oder weniger gut.
Am besten ist es natürlich für Textdateien geeignet,
denn dann kann die Versionsverwaltungssoftware zum Beispiel
nur die Differenzen, also das DIV oder die DELTAS,
zwischen den einzelnen Versionen speichern.
Und das kostet natürlich deutlich weniger Speicherplatz,
als wenn er immer eine komplette neue Version,
zum Beispiel eines JPEG-Bildes, anlegen muss.
Da kann man halt schlechten DELTA machen.
Dann muss er vielleicht die gesamte Datei nochmal kopieren
und abspeichern.
Dann habe ich natürlich bei zwei Versionen
automatisch einen doppelten Speicherverbrauch.
Bei Textdateien in GIT zum Beispiel ist es so,
dass er nur die DELTAS, also die zusätzlichen Zeilen,
zum Beispiel speichert.
Und das ist natürlich kaum ein größerer Speicherverbrauch,
als wenn ich die Datei einfach selber ablege.
Von daher, man muss jetzt so ein bisschen schauen,
was will ich denn überhaupt mit der Versionsverwaltung verwalten.
Binäre Dateien bieten sich da nicht so an.
Alles, was im Textformat vorliegt, ist eigentlich optimal zu versionieren.
Und was bringt mir das jetzt?
Ich kann also jederzeit sagen,
ich erstelle jetzt eine neue Version meiner Dateien,
speichere die ab meinetwegen und mache die so wiederherstellbar.
Ich kann mir jederzeit angucken, wann habe ich was verändert?
Wer hat das überhaupt geändert?
Und wenn man eine vernünftige Commit-Nachricht,
gucken wir uns mal an, was das ist, angibt,
kann man auch sogar sehen, warum etwas verändert wurde.
Also ich kann wirklich eine komplette Historie
meiner Entwicklung bei einem Programm zum Beispiel mir anschauen.
Oder wenn ich meinetwegen einen Text von meinem Azubi lese,
dann kann ich den zum Beispiel Rechtscheidprüfung unterziehen,
oder ich korrigiere da was rein oder schreibe da To-Do-Text rein.
Und wenn dann der Azubi das Ding wieder aktualisiert,
kann er genau die Unterschiede anschauen, die ich dort eingebaut habe.
Und er muss halt nicht die 37 Seiten durchgucken,
wo sich denn was geändert haben könnte,
sondern die Software kann das direkt anzeigen.
Ich habe also eine supergute Nachverfolgbarkeit
und ich habe vor allem auch eine gewisse Persistenz.
Wenn ich Sachen einmal gespeichert habe,
dann sind sie auch gespeichert
und die können mir auch nicht mehr verloren gehen.
Also auch so ein bisschen Sicherung meiner Arbeit,
wenn ich mehrere Stunden irgendwas programmiert habe,
dann stelle ich das mal in die Versionsverwaltungssoftware ein
und dann weiß ich sicher,
dass ich jederzeit auf diesen Stand zurück kann.
Wenn ich also irgendwas kaputt mache,
zum Beispiel ich lösche aus Versehen eine Datei oder wie auch immer,
dann kann ich über die Versionsverwaltung
alles wieder herstellen, wie es mal war.
Und das sind eigentlich unschlagbare Vorteile.
Das brauche ich eigentlich unbedingt bei der Entwicklung,
gerade wenn ich was Neues mal ausprobieren will.
Ich will, was weiß ich,
wenn es auch nur eine Methode umbenennen ist oder sowas.
Und dabei geht mir irgendwas kaputt,
dann habe ich über die Versionsverwaltungssoftware
immer die Möglichkeit, das mit wenigen Befehlen,
manchmal sogar mit wenigen Klicks,
wenn ich so einen grafischen Editor dafür habe,
das alles wieder herzustellen.
Und wenn ich zum Beispiel auch irgendwo einen Bug gefunden habe
in der Software,
dann kann ich mit einer schönen Versionsverwaltung
auch direkt sagen,
wer hat denn diese Zeile in dieser Klasse
zum Beispiel als letztes geändert.
Und dann zeigt mir die Versionsverwaltung
die gesamte Historie an,
wer hat wann was geändert und warum
und auch einen Kontext drumherum und alles.
Also eine wirklich schöne Nachverfolgbarkeit,
wenn es mal Fehler gibt oder ähnliches.
Also das sind alles Vorteile,
die so eine Versionsverwaltungssoftware hat.
Das wäre auch gleich dann die nächste Frage,
was sind denn die Vorteile einer Versionsverwaltungssoftware?
Das ist im Prinzip das,
was ich gerade alles beschrieben habe.
Also das kann ich mit meinem Windows Explorer
zum Beispiel nicht machen.
Wenn ich jetzt Änderungen an einem von seines mache,
klar, dann kann ich das kopieren
und V1 und V2 und V3 dahinter schreiben,
das ist alles toll.
Wenn ich dann aber genau wissen will,
wer hat wann was wie geändert,
dann geht das natürlich damit nicht.
Das heißt auch,
ich glaube das hat auch so einen witzigen Namen,
irgendwie sowas wie Zip-Versionsverwaltung oder sowas.
Da wird einfach nach bestimmten Ständen der Ordner gesippt
und irgendwie mit V1, V2, V3 umbenannt
und dann habe ich da auch meine Versionsverwaltung.
Bringt mir aber nichts,
weil ich mir zum Beispiel auch gar nicht
die Unterschiede angucken kann zwischen den Versionen.
Ich kann halt nicht sehen, wer es gemacht hat,
warum irgendwas gemacht wurde und so weiter.
Es geht alles nicht
und genau dafür brauche ich eine Versionsverwaltung.
Die meisten Versionsverwaltungssoftware
kann man halt auch mit irgendeiner Form von Web-Oberfläche
zum Beispiel anbinden,
dass ich also einfach im Browser
durch die Sourcen durchklicken kann
und ich kann mir highlighten,
was sich da halt geändert hat.
Ich werde irgendwie mit Grün und Rot darauf hingewiesen,
ob Zeilen entfernt oder hinzugefügt wurden und so weiter.
Das sind alles sehr, sehr wertvolle Geschichten,
gerade wenn ich nach einem Fehler suche
oder warum irgendwas auf einmal nicht mehr funktioniert,
dann kann ich das über diese Historie,
die ich da habe, jederzeit nachvollziehen.
Gut, die dritte Frage ist,
was ist SVN oder Subversion?
Also SVN ist einfach nur die Abkürzung dafür.
Das hat keine besondere Bedeutung.
Und Subversion ist eine, ich sage mal,
jetzt heutzutage schon recht alte Versionsverwaltung,
die darauf basiert,
dass sie immer mit einem Server kommunizieren muss.
Das ist also eine zentrale Versionsverwaltungssoftware.
Das bedeutet, ich arbeite auf meinem lokalen Client
und programmiere da zum Beispiel in meinen Java-Sourcen
oder C-Sharp oder Ruby-Sourcen, was auch immer, rum.
Und wenn ich dann sage,
so, jetzt habe ich eine wichtige Änderung fertig,
dann kann ich das auf den Server übertragen.
Der Server erstellt mir dann so eine neue Version
und merkt sich dann, dass ich das war,
wann ich das gemacht habe
und auch noch eine Nachricht, die ich dazu angeben kann.
Und der Nachteil dabei ist,
dass ich immer mit diesem Server sprechen muss.
Wenn der Server nicht erreichbar ist,
dann habe ich ein Problem.
Und das ist jetzt genau das, was Git besser macht.
Das ist jetzt die Frage 4.
Was ist jetzt Git?
Git ist auch eine Versionsverwaltungssoftware,
allerdings eine dezentrale Versionsverwaltungssoftware.
Das bedeutet,
ich muss nicht immer zwingend einen Server im Hintergrund haben,
mit dem ich kommuniziere und wo ich meine Sachen hin kopiere,
sondern ich habe alles bei mir auf der Festplatte liegen.
Die gesamte Historie meines Projekts liegt auf meiner Festplatte.
Das bedeutet auch,
wenn ich keinen Server habe, mit dem ich reden kann,
Beispiel immer so cool für Entwickler,
die ständig auf irgendwelchen Konferenzen sind
und im Flugzeug sitzen,
dann können die auch,
während sie kein WLAN oder UMTS oder LTE
oder was auch immer hoffentlich haben im Flugzeug,
ja, muss man den Flugzeugmodus anschalten,
können sie trotzdem entwickeln und fleißig neue Versionen erzeugen,
denn sie müssen halt nicht mit einem Server reden.
Also diese, wie soll man sagen,
so dass die lokale Entwicklung kann stattfinden,
ohne dass ich mit irgendwem im Netzwerk sprechen muss.
Das ist ein großer Vorteil von Git,
der das System auch so erfolgreich gemacht hat,
weil das halt wirklich ein Novum war.
Alle mussten bei SVN immer auf den Server warten
und dann ist das langsam und das Netzwerk hängt
und bei Git kann ich eben zack, zack, zack alles lokal machen.
Das heißt, es ist super schnell im Vergleich zu SVN auch
und ich habe halt alles, was ich machen will,
bei mir lokal liegen
und ich kann wirklich alle Vorteile,
die mir die Versionsverwaltungssoftware bietet, nutzen,
auch wenn ich zum Beispiel nicht im Netzwerk hänge.
Das sind auch jetzt genau die Vorteile von Git gegenüber SVN.
Das ist nämlich jetzt meine fünfte Frage.
Was sind jetzt die Vorteile?
Und der zentrale Vorteil ist eben,
dass es dezentral ist,
dass ich also keinen Server brauche,
denn dadurch habe ich ganz konkrete Vorteile.
Es ist einfach schneller,
als wenn ich immer mit dem Server reden muss
und ich kann halt auch offline arbeiten im Prinzip.
Und das macht sich ganz schnell bemerkbar.
Wenn ich mir zum Beispiel
so eine Historie angucke von meinen Commits,
dann dauert das bei Git irgendwie eine Sekunde
und dann ist das alles da.
Wenn ich mir das alles erst vom Server holen muss,
dann warte ich da wirklich mehrere Sekunden teilweise,
wenn ich einen langsamen Server habe
oder ein großes Repo auch ein paar Minuten,
bis er dann mal die Historie abgerufen hat.
Und bei jeder kleinen Fitzelaktion
muss ich mit dem Server reden.
Das heißt, wenn ich einen Diff mache,
ein Diff ist also der Unterschied zwischen zwei Dateien,
zum Beispiel in Version 1 und 2,
dann geht er dafür auf den Server
und guckt sich an, was hat sich denn da geändert.
Das muss er alles hin und her transportieren.
Es geht alles übers Netzwerk
und das ist halt super lahmarschig.
Zweiter Nachteil,
wenn ich alles mit dem Server regeln muss, ist,
dass wenn ich einmal mit dem Server Sachen abgeglichen habe,
ich keine Möglichkeit mehr habe,
das irgendwie rückgängig zu machen.
Das heißt, wenn ich eine neue Version im Server erstellt habe,
dann ist die fix
und dann kann ich auch nicht mehr sagen,
oh, ich habe noch was vergessen,
ich habe irgendwie was falsch benannt
oder ich habe noch eine Datei aus Versehen gelöscht
oder was auch immer.
Das kann ich alles nicht mehr ändern.
Die Version ist festgeschrieben.
Und wenn ich Git arbeite
und ich habe eine neue Version erzeugt,
die ich aber mit noch niemandem geteilt habe,
also noch nie irgendwo auf dem Server
oder sonst wo hingepackt habe,
dann kann ich die immer noch komplett ändern.
Weil alles auf meiner Festplatte liegt,
habe ich jederzeit noch die Hoheit darüber
und wenn ich irgendwas vergessen habe,
irgendwas falsch gemacht habe,
dann kann ich das noch korrigieren,
bevor ich es dann vielleicht hochlade
und mit meinen Arbeitskollegen teile.
Und das ist auch ein wichtiger Vorteil,
denn man glaubt gar nicht,
wie oft sowas vorkommt,
dass man dann tatsächlich mal irgendwie was vergessen hat.
Dann hat man doch irgendwie eine Datei zu wenig eingecheckt
und man wundert sich,
warum geht es denn nicht mehr?
Und das stellt man leider zu spät fest
und muss es dann nochmal korrigieren.
Und bei Subversion oder CVS oder so
wäre das halt dann eben nicht mehr möglich.
Und das ist immer eine ganz gute Idee,
dass man, wenn man so eine Version erzeugt,
immer nur eine lauffähige Version erzeugt
und nicht irgendwas kaputtes eincheckt.
Denn wenn jetzt zum Beispiel ein Arbeitskollege
diese Version jetzt auscheckt aus der Versionsverwaltung,
dann hat er erstmal ein nicht lauffähiges Programm zum Beispiel,
weil irgendwelche Compile-Fehler meinetwegen noch drin sind.
Und das wollen wir natürlich auf keinen Fall haben.
Also eine ganz wichtige Richtlinie ist eigentlich bei diesen Versionen,
die müssen immer lauffähig sein.
Man darf also eigentlich auf keinen Fall
irgendwas in die Versionsverwaltung reinpacken,
was irgendwie Fehler enthält.
Denn das macht dann,
wenn quasi die ganze Abteilung einmal so ein Update macht
und sich die neueste Version holt
und bei keinem läuft das Programm mehr
und alle regen sich tierisch auf,
das wollen wir nicht haben.
Deswegen am besten immer darauf achten,
das muss auf jeden Fall lauffähig,
zumindest baubar,
also zumindest kompilierbar sein,
was man da in die Versionsverwaltung packt.
Okay, also Vorteile haben wir geklärt.
Es ist eigentlich rattenschnell im Vergleich zu SVN,
weil wir einfach keinen Server brauchen
und wir können lokal arbeiten ohne irgendeine Netzwerkverbindung.
Also ganz klasse.
Okay, jetzt kommen wir mal so ein bisschen in Richtung der Fachbegriffe.
Die Frage 6 auf meiner Liste ist,
was ist ein Repository?
Ein Repository, das ist ein toller englischer Begriff.
Ich kürze das auch immer gerne mit Repo ab,
weil Repository einfach so lang ist.
Aber ein Repo, das ist quasi meine Datenbank der ganzen Versionen,
die meine Versionsverwaltungssoftware so enthält.
Bei Subversion und bei Git gibt es jeweils auch Repositories,
die heißen auch wirklich so dann, ja, Repository.
Bei Subversion liegt das Repository auf dem Server,
bei Git liegt das Repository auf der lokalen Festplatte.
Das hatte ich gerade halt schon erwähnt.
Wenn ich irgendwas aus der Historie haben will,
dann muss ich bei Subversion mit dem Server sprechen,
weil nur der Server in seinem Repository
diese ganzen Versionen hat.
Bei Git ist es so, dass in dem lokalen Repository auf der Festplatte
alle Informationen über die ganzen verschiedenen Versionen vorhanden sind.
Ich kann deswegen lokal arbeiten.
Es gibt bei Git durchaus aber die Möglichkeit,
sich auch mit einem entfernten Remote-Repository abzugleichen.
Das ist überhaupt kein Problem.
Das wollen wir auch sogar haben.
Ich will meine ganzen Sourcen gar nicht nur auf meiner Maschine haben,
denn wenn die mal abbraucht, dann haben wir ein Riesenproblem.
Aber es gibt halt eben nicht die Pflicht,
die Sachen immer automatisch mit dem Server abzugleichen.
Ich kann halt noch eine gewisse Zeit warten.
Ich kann noch etwas optimieren, Fehler korrigieren,
habe ich gerade gesagt.
Alte Versionen, sage ich mal, korrigieren,
bevor ich die dann mit den anderen teile und so weiter.
Das geht bei Subversion nicht.
Sobald ich eine Version erzeugt habe im Repository,
dann ist die halt fix.
Gut, das ist also das Repository, kann man sich so vorstellen,
wie eine Art Datenbank.
Bei Subversion und bei Git ist es allerdings so gelöst,
dass da, ja doch, bei Subversion gibt es sogar die Möglichkeit,
das auch in der Datenbank abzulegen.
Aber der Standard ist, dass es einfach im Dateisystem liegt.
Und bei Subversion und bei Git ist es sehr ähnlich.
In neueren Versionen von Subversion gibt es einfach einen Ordner,
der heißt .svn und bei Git heißt der Ordner .git.
Und da drin liegt dieses Repository.
Jetzt sind die beiden versionsweiten Systeme relativ unterschiedlich,
wie sie ihre Dateien strukturieren.
Aber im Prinzip kann man sich so vorstellen,
dass für jede Version, die es da gibt,
im Prinzip irgendwo ein Unterordner angelegt wird.
Und da sind dann halt die Dateien drin in der jeweiligen Version,
wie sie halt zu dieser Version gehören.
Ganz so einfach ist es natürlich nicht.
Ich habe gerade schon gesagt, die Versionsverwaltungssysteme,
die speichern nicht unbedingt die ganzen Dateien,
sondern teilweise auch nur die Deltas,
was ja auch sinnvoll ist, um Platz zu sparen.
Von daher, man kann es sich so grob so vorstellen, dass das so ist.
Für jede Version gibt es einen Ordner,
aber im Detail sieht es dann schon noch ein bisschen anders aus.
Aber es ist jetzt so, wenn ich diesen .svn oder .git-Ordner löschen würde
in meinem lokalen Arbeitsordner,
dann wäre halt dieses Repository, diese Versionsinformationen verloren.
Also gut aufpassen, diese Verzeichnisse müssen da sein.
Die fangen standardmäßig immer mit einem Punkt an.
Das weißt du vielleicht von Linux-Systemen.
Da ist es so, dass Ordner, die mit einem Punkt beginnen,
quasi standardmäßig unsichtbar sind, also nicht angezeigt werden.
So eine Art versteckte Dateien ist das.
Und das ist auch sinnvoll,
denn ich will diesen Ordner am besten gar nicht anpacken.
Ich sollte da auf keinen Fall selber drin rumwurschteln,
denn dann mache ich vielleicht meine gesamte Versionsverwaltung kaputt.
Also den Ordner am besten versteckt lassen oder ausblenden oder einfach ignorieren.
Nicht reingehen und drin rum vorwirkeln, außer du weißt genau, was du tust.
Sonst kann es sein, dass deine Versionsverwaltung nachher kaputt ist.
Aber nur, dass du schon mal verstehst, wie es funktioniert.
In deinem lokalen Arbeitsordner gibt es halt so einen Unterordner
und da drin wird diese Versionsinformationen gespeichert.
Bei Subversion nur quasi die aktuelle Version,
bei Git das gesamte Repository, also alle Versionen, die es jemals gab zu diesem Ordner.
So, jetzt stellen wir uns mal vor, es gibt tatsächlich schon irgendwo so einen Repository.
Meinetwegen, du fängst jetzt in deinem Ausbildungsunternehmen an
und sollst an irgendeinem Projekt mitarbeiten,
dann gibt es das Projekt natürlich schon.
Das heißt, irgendwo liegt so ein Repository rum
und du musst dir jetzt quasi dieses Repository auf deine Festplatte kopieren,
um dann damit arbeiten zu können, also zu programmieren zum Beispiel.
Und da habe ich jetzt meine Frage 7 drauf ausgerichtet.
Welche Befehle musst du ausführen, um dir einen Repository zu klonen?
Ich habe jetzt schon genau den Sprachgebrauch von Git benutzt.
Bislang habe ich auch so bei Subversion erzählt, wie das da funktioniert.
Ich spare mir das jetzt mal für die nächsten paar Fragen.
Denn Subversion, ja, wenn du es noch benutzt, kannst du dir sicherlich noch ein Tutorial dazu suchen.
Ich will mich hier ja jetzt auf Git fokussieren.
Also mache ich das jetzt mal nicht mehr so im Detail zu Subversion.
Und bei Git heißt es halt klonen.
Wenn ich mir ein entferntes Repository, also ein Remote-Repo herunterladen möchte
und damit arbeiten möchte, dann heißt es klonen.
Und dementsprechend heißt auch tatsächlich der Kommandozahlenbefehl von Git klonen.
Ich gebe dann einfach ein git clone und dann die URL zu diesem Repository.
Das kann irgendwo ein lokaler Pfad sein, das kann ein Letztlaufwerk sein, das kann eine HTTP, HTTPS-URL sein, das kann eine SSH-URL sein, Git unterstützt da ziemlich viele Protokolle und je nachdem, wie du Zugriff auf dieses Repo bekommst, sieht dann halt deine URL aus.
Dazu habe ich nachher auch noch eine konkrete Frage, nämlich wie kommst du auf die Repos deines Ausbildungsbetriebs überhaupt? Das musst du natürlich dann in deinem Unternehmen klären, wie das überhaupt bei euch funktioniert.
Ich gehe jetzt mal davon aus, dass wir die meisten Repos über HTTP erreichen, gerade wenn man sich so Plattformen wie GitHub zum Beispiel anschaut, die dominante Plattform für Git-Hosting im Internet und da läuft das alles über HTTP oder HTTPS und ich glaube, man kann es auch über SSH machen, aber ich sage jetzt einfach mal, der Standard, weil es so schön einfach ist und auch durch die meisten Firewalls durchgeht, ist es HTTP oder HTTPS.
Dann sieht also der Befehl so aus, git clone und dann HTTP … mein tolles Repo .git zum Beispiel.
Und das .git muss nicht dahinter stehen, weil es nur ein Beispiel, weil es häufig so ist, aber es ist einfach irgendeine URL zu diesem Pfad, wo das Repo liegt.
Und was macht git dann? Klonen heißt wirklich, so wie das Klon Schaf, das heißt, man hat ein zweites Repository, was genau so aussieht wie das entfernte Repository, nur auf der lokalen Festplatte.
Und das habe ich jetzt gerade gemacht. Das heißt, bei einem Klon erzeugt git wirklich eine komplette Kopie des entfernten Repositories bei mir auf der Festplatte.
Und ich habe dann die komplette Historie aller Versionen, die es jemals gab und die in diesem Repo drin sind, bei mir auf der Platte.
Deswegen kann das auch ein Momentchen dauern, wenn das Repo mal ein bisschen größer ist.
Unser zentrales Repo, an dem alle unsere Entwickler zum Beispiel arbeiten, hat glaube ich inzwischen 10.000 Versionen.
Und wir haben um die 20.000 oder 30.000 Module da drin, also einzelne Dateien da drin.
Und bis man das geklont hat, da kann dann schon mal so ein bisschen Zeit vergehen.
Das ist einfach so, weil einfach eine enorme Datenmenge über die Leitung muss.
Allerdings macht git das schon sehr, sehr gut.
Im Gegensatz zu Subversion, wo man teilweise die einzelnen Versionen mitzählen könnte, macht git das eigentlich ganz gut.
Das ist also sehr stark optimiert und alles komprimiert und so weiter.
Also es funktioniert relativ schnell und relativ gut, sich so ein Repo zu klonen.
Man muss nicht allzu lange warten im Vergleich zu Subversion.
Gut, also was mache ich jetzt?
Git klonen und dann habe ich das komplette Repo bei mir auf der Festplatte und dann könnte ich loslegen.
Aber mir fehlt noch ein ganz wichtiger Begriff und das ist jetzt die nächste Frage, die Frage 8.
Was ist eine Arbeitskopie?
Es ist ja ganz toll, wenn ich das Repository jetzt auf meiner Platte habe, aber mit dem Repository kann ich als Entwickler zum Beispiel eigentlich nichts anfangen.
Wie gesagt, das ist wie so eine Art Datenbank, wo die ganzen alten Stände drin sind.
Das ist auch eine tolle Sache, aber was ich ja brauche, ist der aktuellste Stand.
Und zwar will ich meine Sourcen oder meine Textdateien oder was auch immer ja auch aufmachen können und bearbeiten können.
Und wenn ich dafür jetzt immer in so eine Datenbank, in Anführungszeichen, reingehen müsste, wäre das vielleicht ein bisschen schwierig.
Ich brauche natürlich irgendwo Dateien, die auf meiner Festplatte liegen.
Und hier kommt genau das nächste ins Spiel, nämlich die Arbeitskopie.
Was git jetzt zum Beispiel bei einem Klon automatisch macht?
Ich weiß, also alles, was ich hier erzähle, muss man eigentlich immer mit einem kleinen Sternchen versehen.
So im Normalfall ist das so, weil man bei git glaube ich auch so ziemlich alles, was git irgendwie kann, mit 37 Parametern so konfigurieren kann, dass das ganz anders macht, als erwartet.
Aber im Normalfall ist es so, dass git bei einem Klon automatisch auch eine Arbeitskopie davon anlegt.
Was heißt das?
Git nimmt die letzte Version aus dem Repository und checkt das aus.
So kann man das auch nennen und packt das in ein Verzeichnis, eben in diese Arbeitskopie, sodass du quasi im Hintergrund das Repository hast, in diesem Punkt Git-Ordner und die ganzen Versionen auch dir anschauen könntest.
Aber die letzte, die neueste, die aktuellste Version, die liegt wirklich auch ausgecheckt in Sourceform auf der Festplatte und du kannst damit direkt arbeiten, als wenn du ja das Projekt gerade selber angelegt hättest.
Das ist diese Arbeitskopie und das darf man jetzt nicht durcheinander bringen.
Die Arbeitskopie, das ist ein Verzeichnis, wo nur die aktuellste Version drin liegt, beziehungsweise es kann auch eine alte sein, ich kann auch alte Versionen auschecken, aber eine konkrete Version liegt da drin und in meinem Repository liegen halt alle Versionen.
Also das ist quasi die Datenbank im Hintergrund.
Und bei Git kann ich jetzt ganz einfach sowas machen wie, check mir doch mal die Version XY aus, dann gebe ich so eine Nummer an und dann geht der in das Repository rein, holt mir alle Dateien raus zu der jeweiligen Version und packt die in meine Arbeitskopie.
Und so könnte ich zum Beispiel auch auf einem alten Stand meines Projekts arbeiten, was ausprobieren, ein Patch einspielen, was auch immer.
Das kann ich also jederzeit machen. Normalerweise, sage ich mal 90% der Zeit, will ich ja weiterentwickeln.
Das heißt, ich bleibe auf der neuesten Version, entwickle dann weiter und erzeuge halt neue Versionen obendrauf und pack die wieder in das Repository rein.
Ich muss aber immer explizit diesen Schritt gehen.
Wenn ich fertig bin mit der Entwicklung, muss ich die aktuelle Version wieder in das Repository reinbekommen.
Dazu muss ich auch einen expliziten Befehl gleich ausführen, den gehen wir auch gleich durch.
Das ist dann die übernächste Frage.
Doch bis wir dahin gehen, vielleicht nochmal eine weitere Sache.
Angenommen, ich würde jetzt nicht weiterentwickeln, sondern ich warte einfach darauf, dass meine Kollegen irgendwie noch an dem Projekt weiterentwickeln.
Und ich möchte jetzt einfach die aktuellste Version von einem Remote Repository haben, weil meine Kollegen da schon irgendwas reingepackt haben.
Also ich habe jetzt in der Zwischenzeit nichts gemacht, aber meine Kollegen haben fleißig weiterentwickelt und haben ihre neuen Versionen auch schon quasi hochgeladen.
Dann möchte ich jetzt diese neuen Versionen auch auf meiner lokalen Festplatte haben, in meiner Arbeitskopie, damit ich halt eben nicht auf einem alten Stand arbeite, sondern auf dem neuesten.
Und in diese Richtung geht jetzt meine Frage 9.
Welche Befehle musst du ausführen, um deine Arbeitskopie aus einem entfernten Repository zu aktualisieren?
Die Frage ist eigentlich so ein bisschen unscharf.
Eigentlich aktualisiere ich nicht meine Arbeitskopie, sondern ich aktualisiere mein lokales Repository und hole mir alle Versionen aus dem entfernten Repository in mein lokales Repository.
Und dann kann ich sagen, aktualisieren wir bitte meine Arbeitskopie auf die letzte Version.
Aber da Git das genau so macht mit einem einzigen Befehl im Standard, ist die Frage jetzt so ein bisschen, wie kriege ich jetzt die neueste Version in meine Arbeitskopie?
Und das mache ich mit einem simplen Befehl in Git, und zwar Git Pull.
Pull im Gegensatz zu Push, das ist eigentlich ganz gut benannt.
Ein Pull ist nämlich, ich hole mir etwas von einem Remote Repository, also ich ziehe das zu mir runter im Prinzip.
Und ein Push ist das Gegenteil.
Ich schiebe es in das Remote Repository rein, also ich lade es hoch auf einen Server zum Beispiel.
Und mit diesem Pull, da macht Git jetzt folgendes, geht auf das Remote Repo, zieht sich alle Versionen, die er selber noch nicht hat in seinem lokalen Repo, kopiert die in das lokale Repo rein.
Sodass danach das entfernte und das lokale Repository im gleichen Zustand sind, alle Versionen identisch haben.
Und dann nimmt er die letzte Version aus dem lokalen Repo und packt die dann in die Arbeitskopie.
Und als Ergebnis ist es dann halt so, dass ich auf dem letzten Stand des Repositories weiterarbeiten kann und habe jetzt halt eben alle Änderungen, die seit dem letzten Pull oder seit dem letzten Clone passiert sind und die ich bislang noch nicht mitbekommen habe.
Okay, ich schaue mal auf die Uhr, stelle fest, es sind schon fast 30 Minuten wieder rum, aber eine letzte Frage behandle ich noch, und das ist auch eine sehr wichtige Frage.
Nummer 10, was ist ein Commit?
Ich habe bislang immer nur von Versionen gesprochen, und das ist auch grundsätzlich okay, wenn man über Versionsverwaltungssoftware spricht.
Aber die unterschiedlichen Versionsverwaltungssysteme haben durchaus auch einen speziellen Namen für so eine Version.
Und bei Git heißt das Commit. Ein Commit, das ist so eine Version, die ich angelegt habe.
Bei Subversion heißen diese Versionen Revisions.
Das ist auch eher so ein Begriff, den man mit Version in Verbindung bringt. Ja, Revision und Version ist schon sehr ähnlich.
Und Revision auf Englisch, so heißt halt so eine Version bei Subversion.
Und bei Subversion haben diese Versionen auch schöne Nummern, die kann man sich als Mensch sogar fast merken.
Die sind nämlich einfach aufsteigend.
Bei Subversion ist es immer so, dass die Revisions einfach durchnummeriert werden.
Die erste Revision kriegt die Nummer 1, die zweite die 2, 3, 4 und so weiter.
Das heißt, man kann anhand der Revision schon ganz gut sehen, auf welchem Stand ich gerade bin.
Und wenn ich bei Revision 7000 irgendwas bin, dann weiß ich, oh Mensch, es gibt 7000 Versionen.
Bei Git ist das ein bisschen anders. Bei Git wird nicht hochgezählt.
Bei Git werden diese Commits nämlich mit einem Hash versehen.
Und dieser Hash ist quasi dann der Name oder der Schlüssel, die ID für diesen Commit.
Was wird da für ein Hash benutzt?
Ein Hash übrigens, falls du es nicht genau weißt, ist eine mathematische Einwegfunktion,
die aus einem Text variabler Länge eine Zeichenkette fixer Länge macht.
Was bringt das?
Man kann das auch übersetzen mit Prüfsumme.
Ein Hash-Verfahren kann man wunderbar benutzen, um zum Beispiel bei E-Mails zu prüfen,
ob die E-Mail auf dem Weg vom Sender zum Empfänger verändert wurde.
Wenn der Sender einen Hash über die E-Mail baut, dann ist das quasi eine Prüfsumme.
Und wenn der Empfänger auch den Hash noch mal erzeugt und er hat die gleiche Prüfsumme,
dann weiß man, aha, diese E-Mail wurde nicht verändert.
Und im Prinzip ist das das Gleiche hier bei Git.
Hier geht es eigentlich nicht darum, zu gucken, ob irgendwas verändert wurde,
wobei doch auch beim Diff und so wird das auch dafür benutzt.
Aber es ist im Prinzip einfach eine Möglichkeit, die Commits durchzunummerieren,
wobei sie halt nicht nummeriert werden, sondern mit diesen Hashes versehen werden als ID.
Die Hashes sind nicht allzu menschenlesbar.
Das Hashverfahren, was bei Git benutzt wird, ist SHA256.
Das erzeugt einen ziemlich langen Hash, wie du dir wahrscheinlich denken kannst, genau 256 Bit lang.
Und das wird dann als Hexadezimalzahl abgelegt.
Und das ist halt irgendeine wilde Kombination aus den Hexadezimalzeichen.
Und das ist nicht unbedingt wunderbar gut zu merken für Menschen.
Aber darüber brauchen wir uns gar nicht lange aufregen.
So ist das einfach bei Git. Damit muss man leben.
Also überall, wo du so einen Hash siehst, weißt du eigentlich, aha, das ist eigentlich eine Versionsnummer.
Das Doofe bei diesen Hashes ist, dass sie nicht aufsteigend sind.
Die Hashes, wenn die berechnet werden, die folgen keinem besonderen Muster,
dass ich sagen kann, der eine Hash ist größer als der andere.
Das wäre nämlich doof.
Dann könnte man nämlich einen Rückschluss auf die Daten, die da reingegangen sind, ziehen.
Und das soll bei Hashverfahren eigentlich grundsätzlich nicht möglich sein.
Im Gegenteil, wenn ich eine Kleinigkeit verändere, ist es bei einem guten Hashverfahren sogar so,
dass sich der komplette Hash verändert.
Also wenn ich beispielsweise einen Hash bilde über eine E-Mail, die ich geschrieben habe,
und ich verändere nur ein kleines Bit, dann sollte sich der Hash über diese kleine veränderte Mail komplett ändern,
damit ich sofort erkennen kann, dass sich was verändert hat.
Das ist eine ganz wichtige Eigenschaft eines guten Hashverfahrens.
Denn wenn sich zum Beispiel bei einem Hash dann nur die 37. Stelle ändert,
dann sieht der Mensch gar nicht mehr sofort, dass da irgendwo was manipuliert wurde.
Deswegen ist es sogar sinnvoll, dass sich Hashes sehr stark unterscheiden,
auch wenn sich nur Kleinigkeiten bei den Eingangsdaten verändert haben.
Und das führt jetzt dazu, dass die Hashes halt eben nicht alle schön aufsteigend sind,
sondern dass die einfach wild durch die Gegend springen im Prinzip.
Also man kann nicht anhand einer Commit-ID, anhand dieser Hash-Summe herausfinden,
ob es jetzt ein alter oder ein neuer oder ein mittlerer Commit ist.
Im Gegenteil, die sagt einfach gar nichts aus.
Um jetzt aber nochmal zurück auf die Frage zu kommen, was ist denn jetzt ein Commit?
Also ein Commit bei Git ist jetzt halt so eine Version und Git zählt einiges zu dieser Version dazu.
Bei Git zählt zum Beispiel der Autor, der Zeitpunkt des Erstellens dieser Version,
dann der Inhalt natürlich der Arbeitskopie zu diesem Zeitpunkt dazu.
Dann kann man eine Commit-Nachricht angeben, die der Autor verfassen kann,
da werden wir noch drauf eingehen, die zählt mit zu dem Commit dazu.
Und es zählt insbesondere auch dazu der Parent-Commit, also quasi der Eltern-Commit,
also dass es der Commit, von dem der aktuelle Commit abstammt.
Wenn ich zum Beispiel bei Subversion meine Version 2 angelegt habe
und ich erzeuge einen neuen Commit, dann habe ich danach die Version 3.
Das heißt, die Version 3 basiert auf meiner Version 2.
Und so ist es bei Git auch, nur dass ich halt keine schönen aufsteigenden IDs habe.
Deswegen muss ich mir irgendwie anders merken, was ist denn jetzt der Vorgänger-Commit quasi.
Und das heißt bei Git halt eben Parent-Commit.
Es kann auch durchaus zwei Parent-Commits geben, es muss nicht nur einen geben.
Warum und was das bringt, das werden wir noch kennenlernen.
Auf jeden Fall gehört das auch definitiv mit zu diesem Commit dazu.
Und alle diese Informationen, Autor, Uhrzeit, Parent und alles, was ich gerade gesagt habe,
die werden jetzt quasi zusammengenommen auf eine bestimmte Art und Weise und darüber wird der Hash gebildet.
Und dieser Hash wird dann der Schlüssel dieses Commits, also quasi die Commit-ID
und damit wird dann auch dieser Commit im Repository abgelegt.
Wenn du einmal einen Commit erstellt hast mit Git, dann kannst du immer darauf wieder zugreifen.
Der kann also nicht mehr verloren gehen, der ist jetzt in dieser Datenbank persistiert
und ich kann jederzeit mit bestimmten Git-Mitteln wieder darauf zurückgehen
und mir das anzeigen, anschauen, was sich geändert hat und so weiter.
Also wenn ich irgendwie in Git etwas festschreiben will, wenn ich mir eine Version erzeugen will,
dann erstelle ich einen Commit, kriege so eine Hash-Nummer, die dann der Schlüssel dieses Commits wird
und da drin sind dann alle Informationen gespeichert, die ich gerade aufgezählt habe,
um halt genau nachverfolgen zu können, was wurde denn da geändert und wann und so weiter.
Okay, so, dann haben wir schon mal das Wichtigste für heute geklärt, was ist ein Commit
und wir können jetzt hier an der Stelle mal einen kurzen Break machen
und machen dann nächste Woche weiter mit der Git-Einführung.
Zehn Fragen schon mal geschafft.
Ich hätte deutlich mehr erwartet, aber ich quatsche immer viel zu viel.
Okay, aber ich will das Thema ja auch ein bisschen intensiver behandeln,
möchte ganz gern diese Podcast-Folgen auch in Zukunft meinen Azubis oder auch meinen Studenten,
die das auch jedes Jahr immer wieder lernen müssen.
Also nicht immer wieder jedes Jahr neu, aber jeder neue Jahrgang muss wieder Git lernen,
um bei mir in der Vorlesung mitarbeiten zu können.
Deswegen möchte ich denen das auch bereitstellen und von daher ist es für mich auch okay,
wenn ich es ein bisschen ausführlicher mache.
Ich spalte das aber mal auf, weil die Zeit jetzt schon deutlich über 30 Minuten liegt,
deswegen machen wir nächste Woche dann weiter mit den nächsten Fragen.
Die kannst du dir gerne auch schon mal runterladen.
Wie gesagt, melde dich für Newsletter an und dann gehst du auf die Seite und kriegst alle Fragen.
Dann kannst du vielleicht sogar bis nächste Woche das Tutorial schon durcharbeiten
und wenn du dann dich selber prüfen willst, ob du es richtig verstanden hast,
hörst du die nächste Episode an und vergleichst dann mal deine Antworten mit meinen.
Die ersten 10 Fragen kannst du dir aber noch mal nachlesen
und auch das Tutorial habe ich ja auch schon verlinkt, wie gesagt, in den Shownotes
unter anmeldungsentwicklerpodcast.de.
Wie schon gesagt für die 76. Episode.
Wenn du da gerade schon unterwegs bist auf der Website,
dann schau doch mal in meine Links der Woche vom letzten Mal.
Da habe ich nämlich einen schönen Podcast für dich als Empfehlung bereitgestellt.
Der heißt Together We Make IT.
Und das ist so ein, wie der Name schon sagt, ein IT-Podcast,
der erklärt sehr gut verständlich so grundsätzliche Begriffe aus der IT,
wie zum Beispiel Firewall und Netzwerk und Cloud Computing war letztens Thema usw.
Und das habe ich auch schon meinen eigenen Azubis empfohlen.
Gerade für so grundsätzliche Sachen, die eigentlich jeder ITler kennen muss,
ist es halt eine schöne Möglichkeit, sich in kurzen knappen Häppchen,
ich glaube es sind meist so um die 20, 30 Minuten pro Episode,
mal so ein paar grundlegende Sachen anzuschauen.
Wenn du dir noch nicht zum Beispiel das Handbuch für Fachinformatiker angeguckt hast,
wo das natürlich auch alles drin steht und du bist vielleicht eher der Audio-Mensch,
so wie ich zum Beispiel, ich höre ja auch ständig irgendwelche Podcasts,
dann kann ich dir den Podcast sehr empfehlen.
Sind gute Sachen drin, die man auf jeden Fall auch für die Abschlussprüfungen benutzen kann.
Viele gute Definitionen auch so von so Netzwerkthemen usw.
Kannst dir mal reinhören, vielleicht ist das ja was für dich.
Ansonsten hoffe ich, dass heute vielleicht ein bisschen was Spannendes dabei war.
Ich finde Git ist ein ganz ganz wichtiges Thema.
Jeder Softwareentwickler muss das Ding einfach beherrschen.
Wenn man heutzutage irgendwo, was weiß ich, bei Open Source oder so mitarbeiten will,
die arbeiten ja fast alle nur noch mit Git.
Von daher guck dir das Ding unbedingt an und natürlich auch für dich selber.
Sobald du eigentlich irgendwie was schreibst, wovon es mehr als eine Version geben wird,
sei es ein Programm, ein Text, ein Blogartikel, was auch immer,
das geht so einfach mit Git, das Zeug zu versionieren.
Wenn du das installiert hast, kommen wir auch noch in einer der nächsten Fragen dazu.
Man kann eigentlich gar nicht mehr ohne.
Zumindest ich, ich versioniere alles, was ich irgendwie zeuge,
was ich auch sichern will zum Beispiel, das mache ich alles mit Git,
weil es halt so schön einfach ist, wenn man sich mal einmal damit beschäftigt hat.
Und ich hoffe, wir konnten heute schon mal ein paar Sachen klären.
Nächste Woche geht es dann noch ein bisschen weiter und geht noch ein bisschen in die Tiefe.
Ich hoffe, das Thema bleibt dann spannend für dich
und ich würde mich freuen, wenn du nächste Woche wieder reinhörst.
Bis dahin sage ich erstmal für heute vielen, vielen Dank fürs Zuhören und bis zum nächsten Mal. Tschüss!










Hi Stefan,
cooles Thema. Ich finde es sehr nett, dass
gitauch im beruflichen Alltag Einzug hält 🙂Eine Kleinigkeit ist mir noch aufgefallen. Du erwähnst (bei Minute 30:07) das
gitSHA2-256 verwendet. Dem ist leider nicht so auch wenn Einige sehr froh darüber wären, wenngitkryptographisch stärkere Hash-Verfahren unterstützen würde als das aktuell verwendete SHA1 (ref: Cryptographically strong code signing).Gruß Robin
Hi Robin,
oh, danke für den Hinweis. Das habe ich wohl durcheinandergebracht. Wie gut, dass es aufmerksame Hörer gibt 😀
Viele Grüße!
Stefan