Die noch offenen Fragen zur Versionsverwaltung mit Git sind der Inhalt der siebenundsiebzigsten Episode des Anwendungsentwickler-Podcasts.
TL;DR
Vor jedem Commit prüfe ich mit git status und git diff, welche Dateien und Inhalte sich geändert haben. Über den Index wählst du aus, was in deinen nächsten Commit kommt, dessen Nachricht den fachlichen Grund beschreibt. Mit den passenden Git-Befehlen kannst du Commits übertragen und ältere Stände anschauen; Branches und Tags helfen dir dabei, parallel zu entwickeln und bestimmte Versionen wiederzufinden. Für die Arbeit in deinem Ausbildungsbetrieb klärst du außerdem, welche Repositories du bearbeiten darfst und welche Regeln für Commit-Nachrichten sowie Branches gelten.
Podcast: Play in new window | Download (Duration: 35:57 — 16.9MB)
Abonnieren: Apple Podcasts | Spotify | RSS
Kapitelmarken
- [00:00:20] Einstieg und Rückblick auf Commits
- [00:01:10] Änderungen mit git diff und git status prüfen
- [00:04:25] Arbeitskopie, Index und Repository
- [00:05:40] Änderungen auswählen und kleine Commits erstellen
- [00:07:09] Änderungen mit git add aufnehmen und committen
- [00:08:04] Commit-Nachrichten eingeben und fachlich begründen
- [00:10:34] Den letzten Commit mit amend korrigieren
- [00:11:45] Commits mit git push übertragen
- [00:12:46] Vor dem Push Änderungen mit git pull holen
- [00:14:33] Die Historie mit git log anschauen
- [00:15:24] Ältere Commits auschecken und die Arbeitskopie vorbereiten
- [00:18:21] Commits über ihren Hash auswählen
- [00:19:27] Branches und parallele Entwicklung
- [00:22:04] Entwicklungszweige durch einen Merge zusammenführen
- [00:23:18] Automatische Merges und manuelle Konfliktlösung
- [00:25:28] Der Hauptzweig master
- [00:26:03] Versionen mit Tags benennen
- [00:28:23] Fragen für deinen Ausbildungsbetrieb
- [00:29:11] Einsatzgebiete der Versionsverwaltung im Betrieb
- [00:29:56] Git am eigenen Arbeitsplatz einrichten
- [00:30:46] Repositories finden und Zugriffsrechte klären
- [00:31:53] Betriebliche Regeln für Commit-Nachrichten
- [00:32:52] Branching-Strategie und Namen der Branches klären
- [00:33:46] Git praktisch kennenlernen und weiterlernen
- [00:34:53] Shownotes und Fragen als Markdown-Datei
Inhalt
Allgemeine Fragen
- Welche Befehle musst du ausführen, um dir die aktuellen Änderungen in deiner Arbeitskopie anzuschauen?
- Welche Befehle musst du ausführen, um deine Änderungen zu „committen“?
- Was ist der Index?
- Wie ist eine sinnvolle Commit-Nachricht aufgebaut?
- Welche Befehle musst du ausführen, um Inhalte im letzten Commit zu korrigieren/ergänzen?
- Welche Befehle musst du ausführen, um deine eigenen Commits in ein entferntes Repository zu übertragen?
- Welche Befehle musst du ausführen, um den Inhalt deiner Arbeitskopie auf einen alten Commit zurückzusetzen?
- Welche Befehle musst du ausführen, um dir die Commit-Historie eines Repositorys anzuschauen?
- Was ist ein Branch?
- Was ist ein Merge?
- Wie heißt der Standard-Branch in Git? Wie in SVN?
- Was ist ein Tag?
Fragen zum Ausbildungsbetrieb
- Wofür setzt dein Unternehmen Git/SVN ein?
- Was musst du tun, um Git an deinem eigenen Arbeitsplatz nutzen zu können?
- Wo kannst du dir die Repositorys deines Unternehmens anschauen?
- Welche besonderen Regeln für Commit-Nachrichten gibt es bei deinem Unternehmen?
- Welche Branching-Strategie verfolgt dein Unternehmen?
Literaturempfehlungen
Links
- Permalink zu dieser Podcast-Episode
- RSS-Feed des Podcasts
- Wie man eine gute Git-Commit-Nachricht schreibt
- Ein sinnvoller Git-Workflow
Zusammenfassung
Änderungen vor dem Commit prüfen
Vor meinen Commits führe ich git status und anschließend git diff aus. Damit kontrolliere ich, ob die vorgesehenen Dateien und Inhalte zum nächsten Commit gehören.
git statuszeigt dir, welche Dateien sich geändert haben.git diffzeigt die Unterschiede zeilenweise mit etwas Kontext. Farblich hervorgehobene Stellen helfen dir, hinzugefügte oder entfernte Inhalte zu erkennen. Dabei kannst du auch Schreibfehler und falsche Einrückungen entdecken.
Ein Commit hält einen Versionsstand fest. Dazu gehören die betroffenen Dateien sowie Metadaten, etwa die Nachricht, das Datum und der/die Autor:in.
Über den Index festlegen, was du committest
Wenn du Dateien in deiner Arbeitskopie bearbeitest, kannst du die gewünschten Inhalte anschließend in den Index, auch Stage genannt, aufnehmen. git commit erstellt daraus einen Commit im lokalen Repository.
Du kannst ganze Dateien oder einzelne geänderte Zeilen auswählen. Hast du in einer Datei an mehreren Features gearbeitet, lässt sich dadurch für jedes Feature ein eigener Commit erstellen.
Kleine, fachlich zusammenhängende Commits lassen sich leichter beschreiben. Auch beim späteren Merge mit den Änderungen anderer Entwickler:innen bleiben sie überschaubar.
Für den gezeigten Ablauf verwendest du:
bash
git add . –all
git commit
Mit git add . --all übernimmst du die Änderungen im aktuellen Verzeichnis in den Index, einschließlich gelöschter Dateien. Danach erstellt git commit den Commit und öffnet einen Texteditor für die Commit-Nachricht.
Wenn du die Nachricht direkt auf der Kommandozeile eingeben möchtest, verwendest du:
bash
git commit -m "Deine Commit-Nachricht"
Den fachlichen Grund in die Commit-Nachricht schreiben
In deiner Commit-Nachricht hältst du fest, warum du etwas geändert hast. Das kann eine geänderte Anforderung aus dem Fachbereich sein oder ein Fehler, den du beheben musstest.
Git speichert bereits, welche Inhalte geändert wurden und wer sie wann bearbeitet hat. Durch deine Nachricht wird auch der Anlass nachvollziehbar, sodass dein:e Kolleg:in den Commit später einordnen kann.
Weitere Regeln zum Aufbau und zur Formulierung von Commit-Nachrichten sind in meinen Shownotes verlinkt.
Den letzten Commit korrigieren
Wenn dir unmittelbar nach einem Commit ein Fehler auffällt und du ihn noch nicht an das entfernte Repository übertragen hast, kannst du ihn mit folgendem Befehl bearbeiten:
bash
git commit –amend
Damit lässt sich beispielsweise ein Tippfehler in der Commit-Nachricht korrigieren. Auch der Inhalt des letzten Commits kann angepasst werden. Für das beschriebene Vorgehen befindet sich deine Arbeitskopie zunächst auf dem Stand dieses Commits.
Commits an das Remote Repository übertragen
Mit git push überträgst du deine lokalen Commits an ein entferntes Repository. Git kann mit mehreren Remote Repositories arbeiten. Als ausdrücklich angegebenes Ziel wird hier folgendes Beispiel verwendet:
bash
git push origin master
Bei passend konfiguriertem Git reicht git push aus.
Wenn ein:e Kolleg:in zwischenzeitlich neue Commits übertragen hat, musst du diese zunächst lokal übernehmen. Git kann deinen Push sonst ablehnen, weil dir Änderungen aus dem Remote Repository fehlen.
Ich führe deshalb vor jedem Push einen Pull aus:
bash
git pull
git push
Dafür habe ich mir den eigenen Alias git pp eingerichtet, der beide Schritte nacheinander ausführt. Eigene Aliase werden in einer Konfigurationsdatei hinterlegt.
Die Historie und ältere Stände anschauen
Über git log kannst du die Commit-Historie durchgehen. Die neuesten Commits stehen oben. Du findest dort Angaben zu den Autor:innen und zum Zeitpunkt sowie die Commit-Nachrichten.
Möchtest du einen früheren Stand anschauen oder darin etwas ausprobieren, kannst du dessen Hash aus der Log-Ausgabe übernehmen:
bash
git checkout
Git holt die Dateien dieses Commits aus deinem lokalen Repository in die Arbeitskopie. Ein eindeutig zuordenbarer Anfang des Hashes reicht dafür aus; häufig genügen sechs bis sieben Zeichen.
Für diesen Ablauf brauchst du eine saubere Arbeitskopie, in der deine Änderungen bereits committet sind. Wenn beim Wechsel noch offene Änderungen verloren gehen würden, verweigert Git viele entsprechende Befehle. Mit git checkout kannst du auch wieder einen neueren Commit auswählen.
In Branches parallel entwickeln
Wenn du ein Feature getrennt vom Hauptentwicklungszweig ausprobieren möchtest, kannst du dafür einen Branch anlegen. Darin entstehen eigene Commits, während der Hauptzweig weiterentwickelt werden kann. Später kannst du das Feature übernehmen oder verwerfen.
Branches sind in Git leichtgewichtig, weil sie als Zeiger auf Commits dienen. Das Anlegen und Wechseln geht dadurch schnell. Eine mögliche Arbeitsweise besteht darin, für jedes Feature einen eigenen Branch zu erstellen.
Der Hauptzweig trägt im beschriebenen Ablauf den Namen master. Bei Subversion heißt der entsprechende Stamm trunk.
Branches zusammenführen und Konflikte lösen
Durch einen Merge führst du Entwicklungszweige zusammen. Der beschriebene Merge-Commit hat zwei Parent-Commits, sodass beide Entwicklungswege in der Historie verbunden bleiben.
Git kann viele Änderungen automatisch zusammenführen. Das gilt beispielsweise, wenn unterschiedliche Dateien bearbeitet wurden oder wenn Änderungen verschiedene Stellen derselben Datei betreffen.
Haben zwei Entwickler:innen dieselbe Zeile unterschiedlich geändert, kann ein Konflikt entstehen. Dann entscheidest du, welchen Inhalt die Datei erhalten soll. Dafür kann auch eine neue gemeinsame Lösung erforderlich sein.
Versionen mit Tags benennen
Für eine veröffentlichte Version kannst du dem zugehörigen Commit einen Tag geben, etwa v1.0. Dieser Name verweist auf einen bestimmten Stand und erleichtert dir, ihn später wiederzufinden.
bash
git tag v1.0
git checkout v1.0
Der Tag-Name lässt sich beim Checkout als Verweis auf die gewünschte Version angeben. Tags können auch in der Log-Ausgabe erscheinen.
Fünf Fragen für deinen Ausbildungsbetrieb
Diese Fragen habe ich meinem IT-Azubi mitgegeben, damit er die betrieblichen Abläufe mit Kolleg:innen klärt. Die Antworten bekommst du direkt in deinem Ausbildungsbetrieb.
- Wofür wird Versionsverwaltung eingesetzt? Kläre, welche Software eingesetzt wird und welche Inhalte damit versioniert werden. In meinem Betrieb werden beispielsweise auch Dokumente im Fachbereich mit Subversion verwaltet. Git kommt unter anderem für Quellcode und Textdokumente zum Einsatz.
- Wie richtest du deinen Arbeitsplatz ein? Frage dein:e Ausbilder:in oder eine:n Administrator:in, wie du die erforderliche Software installierst und konfigurierst. In meinem Betrieb wird Git als Kommandozeilenwerkzeug über die Softwareverteilung bereitgestellt; für Subversion gibt es den grafischen Client TortoiseSVN.
- Wo findest du die Repositories und welche darfst du bearbeiten? Informiere dich über Zugriffsrechte und vorhandene Weboberflächen. In meinem Betrieb gibt es eine Plattform, auf der ich Repositories durchsuchen und ihre Commits samt Diffs anschauen kann.
- Welche Regeln gelten für Commit-Nachrichten? Dazu können Vorgaben zur Sprache und zum Satzbau gehören. In bestimmten Repositories meines Betriebs ist eine gültige Ticketnummer Pflicht, die ein Skript prüft.
- Welche Branching-Strategie gilt? Kläre vor deinem ersten Commit, wann du einen Branch anlegen sollst und wie er heißen muss. Die gewählte Arbeitsweise hängt vom Betrieb ab und bestimmt, wie du mit deinem/deiner Kolleg:in zusammenarbeitest.
Materialien zum Nacharbeiten
Unter anwendungsentwicklerpodcast.de/77 findest du meine Shownotes. Über meinen Newsletter erhältst du die Fragen aus beiden Git-Episoden als Markdown-Datei. Du kannst sie beim Durcharbeiten eines Tutorials beantworten und die betrieblichen Fragen mit deinem/deiner Ausbilder:in besprechen.
Transkription der gesamten Episode
Automatisch erzeugte Transkription der Episode
Herzlich Willkommen zum Anwendungsentwickler-Podcast, dem Podcast rund um die Ausbildung zum Fachinformatiker
für Anwendungsentwicklung. In dieser Episode geht es weiter mit der Einführung in Git. Viel Spaß dabei!
Hallo und herzlich Willkommen zur 77. Episode des Anwendungsentwickler-Podcasts.
Mein Name ist Stefan Macke und heute geht es weiter mit meiner Einführung in Git.
Wir hatten letzte Woche schon die ersten 10 Fragen rund um die Versionsverwaltung und Git im Speziellen behandelt.
Und heute geht es weiter mit den restlichen Fragen. Und ich halte mich ran, um meine halbe Stunde einzuhalten.
Deswegen legen wir direkt los. Letzte Woche sind wir aufgehört mit der Frage, was ist ein Commit?
Und um nochmal kurz wieder reinzukommen, ein Commit ist also das, was bei Git alles enthält zu einer Version.
Also zum Beispiel eine Nachricht, die Dateien, die verändert wurden, das Datum, der Autor, die Dateien natürlich dazugehören und so weiter.
Und wir wollen uns jetzt heute mal damit befassen, wie wir so einen Commit erzeugen und was man alles vielleicht tun sollte, bevor man das tut.
Und das ist jetzt die erste Frage heute und die 11. auf meiner Liste. Und zwar, welche Befehle musst du ausführen,
um dir die aktuellen Änderungen in deiner Arbeitskopie anzuschauen? Warum ist das wichtig?
Ja, einfach deswegen, weil das, was wir da jetzt geändert haben, ja Teil unseres Commits werden soll.
Wir fangen irgendwie an, was zu entwickeln, ganz egal, ob wir neu anfangen oder bei einem bestehenden Projekt weitermachen.
Irgendwann ist es Zeit und wir sagen, jetzt bin ich fertig mit dem, was ich machen wollte und ich möchte daraus einen Commit machen.
Und dazu möchte ich mir vielleicht erst nochmal einmal angucken, was habe ich denn jetzt überhaupt geändert?
Vielleicht habe ich jetzt ja drei Stunden lang da irgendwas vor mich hin entwickelt und hier ausprobiert und da wieder, keine Ahnung,
was rückgängig gemacht und hier wieder was rein und hin und her. Und um jetzt wirklich zu gucken, was habe ich denn jetzt konkret geändert?
Was wäre jetzt der Inhalt meines nächsten Commits? Dafür kann ich einen netten kleinen Befehl benutzen bei Git.
Und dieser Befehl heißt Diff, D-I-F-F, also nicht zu verwechseln mit dem Diff aus HTML mit D-I-V,
sondern hier geht es um das Diff, die Differenz zwischen der Arbeitskopie und dem, was im letzten Commit drin ist.
Das heißt, ich möchte mir jetzt angucken, was habe ich in der Arbeitskopie geändert im Vergleich zum letzten Commit.
Das Git Diff zeigt mir wirklich die Unterschiede der einzelnen Dateien an.
Das heißt, wenn ich Dateien angelegt habe, verändert habe, gelöscht habe und so weiter,
dann kann ich auf der Konsole wirklich Zeile für Zeile sehen, was hat sich verändert im Vergleich zur vorherigen Version.
Da wird dann auch mit Rot und Grün schon dargestellt, ob was dazugekommen ist, was verändert wurde, was gelöscht wurde und so weiter.
Und ich kann wirklich auf Inhaltsebene gucken, ist das denn jetzt alles richtig, was ich da gemacht habe.
Ich kann also, ich sehe auch wirklich nur das, was ich verändert habe, nicht nochmal alle Dateien komplett,
sondern es werden mir die Highlights, also die Highlights nicht, sondern das, was ich verändert habe, wird hervorgehoben,
aber auch mit einem gewissen Kontext drumherum, sodass ich das also auch einordnen kann, was jetzt davor und danach steht.
So zwei, drei Zeilen, das kann man zum Beispiel auch in Git konfigurieren, wie viele der anzeigen soll.
Standardmäßig sind es, glaube ich, drei und ich kann also auch sehen, in welchem Kontext da irgendwas passiert ist.
Das heißt, ich kann jetzt nochmal kontrollieren, sind die Inhalte denn jetzt richtig,
habe ich da vielleicht irgendwo noch einen Rechtschreibfehler drin oder habe ich die Einrückung falsch oder wie auch immer.
Das kann ich nochmal eben schnell auf der Konsole kontrollieren, bevor ich das jetzt gleich zu einem Commit mache.
Und ein anderer Befehl, den man auch noch schön nutzen kann, der einem nur die Übersicht zeigt, welche Dateien sich verändert haben,
aber nicht die Inhalte dieser Dateien.
Also beispielsweise wird mir aufgelistet, Datei abc.txt wurde verändert, aber nicht, was verändert wurde.
Das ist der Befehl Status.
Also mit Git Status, S-T-A-T-U-S, Status, kann ich mir anzeigen, welche Dateien verändert wurden.
Und mit Git Diff, D-I-F-F, kann ich mir wirklich auch die Inhalte dieser Dateien anschauen und gucken,
was sich im Vergleich zum letzten Commit verändert hat.
Und das sind eigentlich zwei Befehle, die ich eigentlich immer ausführe, bevor ich ein Commit mache,
weil ich immer nicht genau weiß, ob da noch vielleicht was dazugekommen ist, was ich gar nicht committen will usw.
Das heißt, ich hab's quasi wirklich schon so im Muscle Memory, in der Muskelerinnerung,
bevor ich ein Git Commit mache, mach ich immer Git Status, bzw. ich hab mir einen Shortcut dafür angelegt,
Git S-T einfach nur, Git S-T, kann man schon da tippen.
Dann zeigt die man, welche Dateien sich verändert haben, dann weiß ich schon mal, ob das passt oder nicht.
Und sofort danach mach ich eigentlich ein Git Diff, um zu gucken, was die Inhalte angeht, ob das auch korrekt ist.
Und wenn das dann beides korrekt ist, dann geht's los mit dem nächsten Schritt,
nämlich mach meinen Commit bitte aus meinen Änderungen.
Und das ist jetzt auch genau die nächste Frage, Nummer 12 auf der Liste.
Welche Befehle musst du ausführen, um deine Änderungen zu committen?
Und das ist jetzt bei Git relativ einfach, das heißt nämlich einfach Commit.
Also Git, Commit und dann war's das.
Und dann packt der alles, was, jetzt ist die große Frage, was in der Arbeitskopie ist, in den Commit.
Nein, leider nicht, das wäre ja viel zu einfach, wenn er das machen würde.
Deswegen müssen wir uns vorher noch etwas anderes anschauen, nämlich den sogenannten Index.
Bei Subversion wären wir jetzt tatsächlich fertig.
Wenn ich ein Commit mache bei Subversion, wird einfach alles, was sich in der Arbeitskopie verändert hat, auf den Server übertragen.
Bei Git gibt es noch so eine Art Zwischenschritt, eine Art Zwischenebene oder auch Stage genannt, und zwar den Index.
Der Index, das, was da drin ist, das wird in den nächsten Commit gepackt.
Also es gibt bei Git im Prinzip ein dreistufiges Konzept.
Es gibt einmal meine Arbeitskopie, das ist das, was wirklich in dem Ordner auf der Festplatte liegt.
Dann gibt es den Index, da kann ich selektiv Sachen aus der Arbeitskopie reinpacken, die dann committet werden.
Und dann gibt es als letztes das Repository, wo halt meine fixen Commits, die ich schon erledigt habe, drin sind.
Und ganz wichtig bei Git ist jetzt, dass nur das, was im Index ist, in den nächsten Commit kommt.
Nicht automatisch alles, was in der Arbeitskopie ist.
Was hat das für einen Vorteil?
Ganz einfach, bei Subversion zum Beispiel konnte ich nur sagen, ich möchte die Änderung an dieser Datei komplett committen oder gar nicht.
Wenn ich jetzt aber zum Beispiel drei, vier Stunden lang irgendwas entwickelt habe und bin endlich fertig,
habe aber in diesen drei, vier Stunden leider zwei Features implementiert und nicht nur eins.
Und ich möchte jetzt tatsächlich für das erste Feature nur die Sachen committen, die zu dem Feature dazugehören.
Und nicht alle anderen auch, die zufällig in der gleichen Datei mit drin sind für Feature 2.
Dann geht das bei Subversion nicht.
Bei Git kann ich jetzt sagen, ich möchte gern aus der Datei nur die Zeilen, was weiß ich, 10 bis 20 in den Index packen.
Und dann wird auch nur das committet und nicht alles, was in der Datei drin steht.
Und das kann man auch auf Dateiebene machen, das heißt, ich kann in den Index eine Datei reinpacken, aber die andere nicht.
Und ich kann also wirklich sehr selektiv sagen, was committet werden soll und was nicht.
Ist übrigens auch eine ganz gute Idee, bei Git und bei jeder Versionsverwaltungssoftware so kleine Commits wie möglich machen.
Also ein paar Zeilen reichen eigentlich schon.
Das ist dann viel, viel einfacher zu beschreiben, was ich da eigentlich gemacht habe und warum.
Und vor allem, da kommen wir dann später noch zu, wenn wir unsere Inhalte später mit den Änderungen anderer Entwickler zusammenbringen möchten,
also die mergen möchten, dann ist es viel, viel einfacher, wenn ich nur kleine Änderungen habe,
als wenn ich einen Commit gemacht habe, in dem ich 1000 Dateien geändert habe und 100.000 Zeilen dazukommen.
Da blickt natürlich danach ja kein Mensch mehr durch.
Deswegen kleine, feine Commits machen.
Und deswegen ist es schon durchaus sinnvoll, dass man auch mal einzelne Zeilen aus einer Datei nur committet und nicht halt alles, was da drin ist.
Weil es einfach zum Beispiel zu unterschiedlichen Features gehört.
So, jetzt natürlich die zentrale Frage, wie kriege ich denn meine Inhalte in diesen Index rein?
Und das ist bei Git der Befehl add.
Also das wie addieren, hinzufügen, add.
Das fügt jetzt bestimmte Änderungen in den Index ein.
Wenn ich einfach alles hinzufügen will, was sehr oft der Fall ist, wenn ich vernünftig entwickle,
mache ich einfach git add.
Punkt für das aktuelle Verzeichnis auf Windows und Linux identisch.
Und wenn ich auch Sachen hinzufügen will, die ich zum Beispiel gelöscht habe,
dann bei add könnte man denken, dass er nur Sachen hinzufügt, was auch richtig ist.
Wenn ich aber Dateien jetzt gelöscht habe, dann wird mir das add das nicht hinzufügen.
Deswegen mache ich meistens noch einen Kommandozeilenparameter all dahinter.
Und dann sieht die komplette Zeile so aus.
Git add Punkt minus minus all.
Und dann packt er alles, was sich verändert hat, egal ob gelöscht, manipuliert, hinzugefügt, wie auch immer, in diesen Index rein.
Und als nächstes kann ich dann mit git commit meinen Commit abschicken und dann bin ich fertig.
Beim Commit aber noch eine ganz wichtige Sache.
Denn jeder Commit benötigt eine Commit-Nachricht.
Ich muss als Entwickler da reinschreiben, warum habe ich diesen Commit gemacht.
Ich muss in den Commit nicht reinschreiben, was ich gemacht habe, denn das speichert Git.
Ich kann in Git einfach nachvollziehen, welche Dateien wurden verändert, was wurde genau geändert,
wann wurde das geändert, wie hat es geändert.
Das kann ich alles nachvollziehen, aber nicht, warum es geändert wurde.
Und deswegen muss ich unbedingt als Mensch einmal eingreifen und aufschreiben, warum habe ich jetzt diesen Commit gemacht.
Also eine fachliche Begründung im Prinzip abliefern.
Und das passiert bei Git automatisch.
Wenn ich git commit mache und nichts weiter angebe, dann geht der Texteditor meines Systems auf.
In 99% der Fälle der VI übrigens.
Eine ganz tolle Sache, wenn man sich nicht mit VI auskennt, kann man gar nicht committen,
weil man gar nicht weiß, wie man die Datei verlässt.
Aber das sind andere Probleme.
Wenn ich diesen Editor nicht benutzen möchte, kann ich einfach machen git commit und dann "-m",
m für message, und dahinter dann in Anführungszeichen meine Commit-Nachricht eingeben.
Und dann bin ich eigentlich sofort fertig.
Also wenn ich was committe und ich weiß schon, was ich committen will und warum,
dann mache ich einfach git commit "-m", das ist mein toller Commit, und dann bin ich fertig.
Er macht sofort den Commit, ohne den Editor aufzumachen, und dann bin ich damit durch.
So, die nächste Frage habe ich quasi gerade schon angerissen.
Das ist auf meiner Liste die Nummer 14.
Wie ist eine sinnvolle Commit-Nachricht aufgebaut?
Und da gibt es jetzt verschiedene Möglichkeiten, wie man das tun kann.
Ich habe auch schon mal vor einiger Zeit einiges im Blog verlinkt zu einer guten Commit-Nachricht.
Da schaust du am besten mal rein, das brauchen wir hier nicht im Detail durchkauen.
Wichtig ist nur eigentlich das, was ich gerade gesagt habe.
Es muss drinstehen, warum ich etwas gemacht habe.
Was ist die Begründung dafür und nicht, wie ich etwas gemacht habe.
Denn das kann ich halt in der Visionsverwaltungssoftware viel besser nachvollziehen.
Ich kann einen Diff machen, und er zeigt mir genau die Zeilen an, die sich verändert haben.
Das sagt mir aber nicht, warum ich das getan habe.
Wollte der Fachbereich das anders haben, oder war da ein Bug, den ich fixen musste, oder, oder, oder.
Also was ist die Anforderung, warum habe ich etwas getan?
Das ist im Prinzip das, was mir das Versionsverwaltungssystem nicht beantworten kann.
Das kann nur der Mensch, und deswegen müssen wir das in diese Commit-Nachricht reinschreiben.
Wie man die jetzt genau aufbauen sollte, wie das Wording ist, oder wie man die Sätze strukturiert,
und Zeilen und Buch und hin und her, das gehe ich jetzt nicht im Detail durch.
Das haben andere schon besser gemacht, habe ich in den Shownotes verlinkt.
Übrigens unter www.anwendungsentwicklerpodcast.de-77 für die 77. heutige Episode hier.
Würde ich mir unbedingt mal angucken, da gibt es ein paar schöne Regeln, die man einhalten kann,
und dann freuen sich auch die Kollegen, weil sie gut verstehen, was du mit der Message aussagen möchtest.
So, jetzt haben wir einen tollen Commit gemacht und stellen fest,
oh, ich habe etwas vergessen, oder ich habe etwas falsch geschrieben.
Eine Commit-Nachricht, zum Beispiel Rechtschreibfehler drin, oder wie auch immer.
Dann können wir jetzt einen der Vorteile von Git ausspielen, nämlich die Historie verändern.
Wir können den letzten Commit, wenn wir ihn noch nicht in das Remote Repository übertragen haben,
noch jederzeit anpassen und korrigieren.
Das ist ein ganz tolles Feature von Git und das würde ich auch deswegen unbedingt hier heute mal durchsprechen.
Und der Befehl dafür ist relativ einfach.
Wenn ich jetzt einen Commit abgesetzt habe, ich habe noch nichts weiter wieder verändert,
also ich bin jetzt nicht schon wieder angefangen und habe 37 andere Sachen weiter programmiert,
sondern mir fällt das jetzt direkt auf und ich habe meine Arbeitskopie quasi auf dem Stand des letzten Commits.
Ohne zusätzliche Änderungen kann ich relativ einfach mit dem Befehl
Git Commit – Amend, A-M-E-N-D, den Inhalt des letzten Commits bearbeiten.
Wenn ich das einfach nur so eingebe, dann geht ein Editor auf, wieder mal der VI meistens,
und ich kann zum Beispiel meine Commit-Nachricht bearbeiten
oder ich kann auch Dateien ein- und ausschließen aus dem Commit und so weiter.
Das ist ein sehr einfacher Befehl und häufig, wenn ich mir einfach nur vertippt habe,
dann ist das relativ schnell gemacht.
Ich kann das ganz einfach korrigieren mit dem Git Commit – Amend.
Wenn wir jetzt aber tatsächlich fertig sind und wir haben auch keinen Fehler gemacht
und wir sind uns sicher, jetzt kann das Zeug auch meinen Entwicklerkollegen bereitgestellt werden
und ich möchte das auf das Remote Repository übertragen,
dann ist jetzt Frage 16, welche Befehle muss man denn dafür ausführen?
Wie kriege ich meine Commits in das entfernte Repository?
Und analog zu dem Git Pull, das wir schon kennengelernt haben,
um Änderungen aus dem entfernten Repository herunterzuladen, ist das jetzt genau Git Push.
Damit lade ich meine Sachen auf das Remote Repository hoch.
Bei Git ist es jetzt so, es kann nicht nur ein Remote Repository geben, ich kann auch mehrere anlegen.
Von daher wäre der komplette Befehl, den ich eigentlich ausführen müsste,
um gegen das Standard Remote Repository zu pushen, Git Push Origin Master.
Was das aber alles im Konkreten heißt, wollen wir jetzt hier gar nicht durchgehen.
Wenn das Git vernünftig konfiguriert ist und du nur einen Remote Repository hast,
reicht ein Git Push aus und dann packt er deine Änderungen, deine letzten Commits,
die noch nicht übertragen wurden, automatisch in das Remote Repository.
Jetzt ist es so, wenn du etwas in das Remote Repository übertragen möchtest,
kann es ja durchaus sein, dass in der Zwischenzeit, wo du angefangen hast zu entwickeln und jetzt fertig bist,
auch ein anderer Kollege weiterentwickelt hat und in das Remote Repository schon mal was reingepusht hat.
Das ist durchaus normal, weil ihr da irgendwie gleichzeitig arbeitet.
Und wenn man zum Beispiel mit 20 Kollegen in einem Projekt arbeitet,
dann kann es einfach durchaus sein, dass jemand anderes auch mal was verändert hat und auch das schon gepusht hat.
Deswegen ist es eigentlich sehr, sehr ratsam, vor jedem Push auch einen Pull zu machen,
um sich alle Änderungen, die eventuell schon remote im Repository drin sind,
nochmal auf die Festplatte zu übertragen.
Das musst du nicht tun.
Aber wenn du zum Beispiel pushst und jemand anders hat vor dir schon was Neues gepusht,
dann wird Git dir erst mal sagen, Moment mal, geht nicht.
Es gibt im Remote Repository noch Änderungen, die du lokal bei dir noch nicht kennst.
Du kannst jetzt nicht pushen.
Das heißt, du musst sowieso in diesem Fall dann immer einen Pull machen.
Wenn du jetzt also mit dem Repo arbeitest, wo zum Beispiel du alleine drauf bist oder es einfach nicht so viele Pushes gibt,
kannst du auch einfach direkt einen Git-Push machen.
Ich habe es mir inzwischen schon angewöhnt, vor jedem Push automatisch immer einen Pull zu machen,
weil das sowieso ganz häufig jedenfalls bei den Repos, mit denen ich arbeite, vorkommt,
weil halt ständig Kollegen damit arbeiten und alles.
Und dieses Pushen, das dauert auch einen kleinen Moment.
Und dann kriege ich als Fehlermeldung, ah, da hat schon jemand anders gepusht.
Von daher, diese Zeit kann ich mir sparen.
Ich mache sofort einen Git-Pull und sofort danach einen Push und dann habe ich alles übertragen.
Und weil ich das so häufig mache, habe ich mir dafür sogar ein Alias angelegt.
Mit Git-PP für Push-Pull, beziehungsweise umgekehrt Pull-Push, macht Git genau das.
Erst einen Pull und dann einen Push und so kann ich auf jeden Fall meine Sachen relativ einfach übertragen,
ohne viel Text eingeben zu müssen.
Wie man ein Alias definiert, das ist jetzt hier nicht Thema im Podcast, das erkläre ich auch nicht,
aber das findest du sicherlich mit einer Google-Suche ganz einfach raus.
Das ist ein kleiner Eintrag in einer Config-Datei und dann kannst du dir deine eigenen Alias-Befehle anlegen.
Okay, jetzt haben wir schon fleißig unsere Änderungen committed und gepusht.
Das heißt, wir haben uns jetzt auch mit dem Remote Repository abgeglichen.
Wir haben vielleicht auch gerade einen Pull gemacht und Änderungen von Kollegen heruntergeladen.
Und jetzt möchte ich einfach mal gucken, was wurde denn eigentlich in unserem Repository so in letzter Zeit geändert?
Also wie kann ich mir jetzt tatsächlich die Historie meines Repos anschauen?
Und das ist ein relativ einfacher Befehl, Git-Log.
Und zwar L-O-G, also wie Log-Einträge in einem Logbuch.
Und damit zeigt mir Git jetzt einfach alle Commits der letzten Zeit an, und zwar historisch absteigen.
Das heißt, die neuesten sind dann oben.
Und ich kann dann einfach durchscrollen im Prinzip und mir genau angucken, wer hat was wann verändert.
Und am besten auch warum, denn das steht ja in der Commit-Nachricht drin.
Also Git zeigt mir dann eine schöne, lesbare Variante an.
Und ich kann halt schnell herausfinden, was dann in letzter Zeit so passiert ist.
Wenn ich jetzt zum Beispiel feststelle, da ist ein interessanter Commit drin, da würde ich mir jetzt gerne mal was angucken.
Den möchte ich mir jetzt mal anschauen, den möchte ich auschecken, sage ich mal.
Also meine Arbeitskopie auf diesen einen Stand des Commits einfach zurücksetzen, um da drin jetzt mal was auszuprobieren oder sowas.
Angenommen, ich habe eine alte Version, ich möchte jetzt da irgendwas drin patchen oder wie auch immer.
Wie kriege ich jetzt meine Arbeitskopie auf diesen alten Stand eines Commits zurückgesetzt?
Und das ist jetzt genau die nächste Frage, die Nummer 18 auf meiner Liste.
Welchen Befehl muss man ausführen, um den Inhalt der Arbeitskopie auf einen alten Commit-Stand zurückzusetzen?
Das ist jetzt eine Frage, da kann man alleine, glaube ich, eine halbe Stunde darüber reden.
Weil Git so viele verschiedene Möglichkeiten hat, Sachen quasi auszuchecken, aber den Index nicht zurückzusetzen
oder doch oder Arbeitskopie auf Index und hin und her.
Es gibt so viele verschiedene Kombinationen.
Ich nehme jetzt mal nur einen Befehl, der auf jeden Fall funktioniert und in den meisten Fällen das tut, was er soll,
nämlich dir die Arbeitskopie auf einen alten Commit-Stand zurückzusetzen.
Vorausgesetzt, du hast aktuell keine Änderungen in deiner Arbeitskopie, die du noch nicht committet hast.
Das nennt man übrigens auch eine saubere Arbeitskopie.
Wenn alles, was in deiner Arbeitskopie drin ist, auch in einem Commit ist und du also keine Änderungen mehr hast, die nicht committet wurden,
dann hast du eine saubere Arbeitskopie und dann kannst du alle Befehle auch anwenden, um deinen Stand zurückzusetzen.
Wenn du noch Dateien geändert hast in deiner Arbeitskopie, dann wird Git dir viele Befehle einfach nicht erlauben,
weil er nämlich sagt, hey, wenn ich jetzt die Arbeitskopie zurücksetze, du hast aber noch Änderungen da drin,
dann sind die Änderungen ja futsch.
Und das möchte Git eigentlich immer verhindern.
Also du musst ihn schon dazu zwingen, dir Sachen kaputt zu machen.
Das ist eigentlich eine ganz tolle Sache.
Du kannst eigentlich nur mit Aufwand die Sachen tatsächlich zerstören.
Aber die Standardbefehle, die berücksichtigen das immer und die sagen ja immer,
nö, mach ich nicht, du hast noch Änderungen.
Sieh zu, dass du die committest oder selber zurücknimmst oder wie auch immer.
Aber ich ändere hier nicht einfach deine Arbeitskopie und mach deine Arbeit kaputt.
Da kann eigentlich bei Git relativ wenig schief gehen.
Und der Befehl, mit dem man das jetzt recht einfach machen kann, ist tatsächlich git checkout.
Mit git checkout kann man einen bestimmten Commit auschecken.
So heißt es zum Beispiel auch bei Subversion.
Bei Subversion ist aber etwas anderes damit gemeint.
Bei Checkout bei Subversion bedeutet nämlich, dass du einen Repository klonst im Prinzip.
Nur klonen gibt es ja bei Subversion nicht.
Du hast das ganze Repo ja nicht auf der Festplatte, sondern nur die letzte Version.
Deswegen heißt es bei Subversion einfach nur Checkout.
Du holst dir also eine bestimmte Version aus deinem Subversion-Server herunter.
Und bei Git heißt das halt klonen.
Dafür heißt bei Git eben Checkout, dass du auf einen bestimmten Stand in deiner Arbeitskopie zurücksetzt.
Das bedeutet also, dass er quasi in dein lokales Repository reingeht.
Bei Git ist ja alles lokal.
Er holt sich dann die Dateien, wie sie im Stand dieses Commits waren und packt die in deine Arbeitskopie.
Und dann ist quasi dein Festplattenordner auf dem Stand dieses alten Commits.
Und du kannst jetzt da drin machen, was du willst.
Um den Stand jetzt auszuchecken, musst du dir aber noch sagen, welchen Commit du haben willst.
Und das machst du über den Hash.
Das heißt, am besten kannst du dir mit Git Log vorher angucken, welche Hashes gibt es denn da so.
Dann kopierst du dir den Hash raus oder du tippst ihn ab, je nachdem, wie du Lust hast.
Und sagst dann einfach Git Checkout und dann der Hash.
Da der Hash jetzt aber eine sehr lange Hexadezimalzahl ist, ist es sehr ungünstig, das immer einzutippen.
Und Git ist sehr intelligent.
Der stellt nämlich fest, wann diese Hashes eindeutig sind.
Die Hashes sind immer so unterschiedlich, dass es eigentlich reicht, die ersten paar Ziffern des Hashes einzugeben.
Und je nachdem, welche dafür aussagekräftig genug sind, dann hört er auch auf und zeigt danach auch nicht mehr weitere Stellen an.
Das heißt, du könntest auch ein Git Checkout und dann, ich sag mal, sechs bis sieben Ziffern eingeben.
Das reicht in den meisten Fällen schon.
Du musst nie diesen, ich glaube, es sind 40 Stellen langen Hash da eingeben.
Die ersten paar reichen eigentlich schon aus, sofern die dann halt eben eindeutig sind über das gesamte Repository.
Gut, damit können wir uns jetzt auch alte Sachen wieder angucken.
Wunderbar, mit dem gleichen Befehl kann ich jetzt auch wieder zurück auf den letzten Commit gehen.
Ja, also ich kann wunderbar damit hin und her springen und dann einfach weiterarbeiten.
Und jetzt kommen wir noch zu so ein paar Begriffen, die eigentlich relativ wichtig sind.
Auch bei jeder Versionsverwaltung, die gibt es auch fast überall.
Und die gucken wir uns mal in Bezug auf Git an.
Und zwar die Frage 19. Was ist ein Branch?
Ein Branch, das englische Wort für Zweig, ist wie bei einem Baum tatsächlich.
Ein Zweig, der von dem Stamm des Baums irgendwie zur Seite abweicht.
Wenn man sich bei der Versionsverwaltung mal vorstellt, ich habe einen Strang meiner Versionen, die immer aufeinander aufbauen.
Die bilden quasi den Stamm meines Programms meinetwegen.
Und der wird immer weiterentwickelt und wird immer höher, dieser Baum im Prinzip.
Ich kann jetzt aber zu einem beliebigen Zeitpunkt auch von diesem Stamm abweichen, quasi nach
links oder nach rechts mal so einen Schlenker machen und einfach weiterentwickeln parallel
zu der Weiterentwicklung des Stamms.
Ich kann mir jetzt also so etwas vorstellen wie, ich habe meine Software, die wird immer
fleißig weiterentwickelt, aber an einem bestimmten Zeitpunkt überlege ich mir jetzt, ich will
mal ein neues Feature ausprobieren, ohne dass ich ständig an diesem Hauptstamm weiterarbeiten
will.
Ich zweige jetzt einfach mal ab in meinen ganz eigenen Branch, bastel da drin mal ein
paar Sachen, mach mal 1, 2, 3, 4 Commits und wenn ich dann fertig bin damit, dann sage
ich, okay, ich möchte das entweder wegschmeißen, weil es doof ist, oder ich will es übernehmen
in den Stamm.
Also mein Feature, was jetzt fertig ist, das packe ich jetzt wirklich zurück in das Hauptprogramm
und dann wird quasi dieser abgezweigte, ja, Zweig wieder zurück in den Stamm überführt
und kann dann also auch, dann kann ich dieses Feature, was ich da entwickelt habe, auch
in dem Hauptstamm meines Programms dann benutzen.
Und diese Branches, das ist ein tolles Feature in Git, weil die so leichtgewichtig sind.
In Subversion heißt ein Branch die komplette Kopie des Repositories quasi anlegen und nochmal
eins zu eins alle Sourcen neu in einen Commit reinzupacken, um dann weiterzuarbeiten.
Das heißt, es ist enorm teuer.
Wenn ich jetzt also auch diese Branches zum Beispiel wechseln will, dauert das ewig, weil
er alle Dateien quasi hin und her kopieren muss.
Bei Git ist das relativ simpel, das ist nämlich einfach nur so eine Art Zeiger auf einen bestimmten
Commit und wir haben schon gelernt, dass Git sich bei jedem Commit immer merkt, was denn
der Parent Commit ist.
Und wenn ich jetzt einen Branch anlege, dann habe ich eigentlich nur einen neuen Commit,
der auf den gleichen Parent zeigt wie irgendein anderer Commit, der in diesem Stamm läuft.
Aber das interessiert diesen neuen Branch gar nicht, der muss dann nicht alles hin
und her kopieren oder sonst was, der hat sich einfach nur gemerkt, woher komme ich denn.
Und deswegen ist das auch super schnell gemacht.
Wenn ich den Befehl eingebe git branch –b und dann gebe ich da irgendwie Namen ein zum
Beispiel, dann habe ich diesen Branch angelegt und kann einfach weiterentwickeln.
Das dauert nicht mal eine Sekunde, dann ist der fertig.
Das ist also sehr, sehr einfach, diese Branches anzulegen und auch die Branches nachher wieder
zurück in den Hauptstamm zu bekommen.
Dieser Vorgang nennt sich dann übrigens Merge.
Das ist dann gleich die nächste Frage auf meiner Liste.
Also, wenn ich einen Zweig quasi angelegt habe und ich möchte den zurück in meinen
Stamm bringen, dann nennt sich das Merge.
Und der Commit, der dabei entsteht, ist auch ein Merge-Commit.
Der hat nämlich dann zwei Parent-Commits.
Wie sieht das aus?
Stell dir mal vor, du hast so einen Stamm, das ist dein Hauptentwicklungszweig und irgendwann
zweigst du dann halt ab, sag ich mal, nach rechts, wie so eine Bahnschiene, die nach
rechts dann halt mal so eine Weiche hat und dann geht dann halt die zweite Bahnschiene
weiter und dann hast du da Commit, Commit, Commit, Commit und irgendwann gehst du dann
wieder zurück in den Hauptzweig.
Also du hast mal so einen kleinen Schlenker gemacht, wie so eine Art Kurve und der soll
jetzt wieder in den Hauptstamm übertragen werden, dann wird dieser Commit, der jetzt
erzeugt wird, zwei Parent-Commits haben, nämlich einmal den Commit aus dem Stamm, den er schon
kennt und jetzt dazu auch noch deinen letzten Commit aus dem Branch, den du angelegt hast.
Und beides zusammengeführt ergibt jetzt den neuen Stamm.
Das heißt, du hast die gesamte Entwicklung, die auf dem Stamm stattgefunden hat, in diesem
Commit drin und zusätzlich auch alle Commits, die in deinem Branch stattgefunden haben.
Das heißt, du hast jetzt wirklich beide Entwicklungszweige wieder zusammengeführt
und dabei kann natürlich auch ein bisschen was schiefgehen.
Wenn du nämlich Dateien in deinem Branch bearbeitet hast, die auch jemand anderes in
dem Stamm bearbeitet hat, dann gibt es vielleicht Konflikte, denn du hast, was weiß ich, eine
Variable auf den Wert 5 gesetzt und der andere hat sie auf den Wert 6 gesetzt.
Was soll denn jetzt gewinnen?
Das heißt, in diesem Fall musst du jetzt als Mensch zum Beispiel hergehen und die Sachen
so ein bisschen auseinanderfrickeln bzw. zusammenführen, wenn Git das nicht von alleine machen kann.
Git ist sehr, sehr intelligent.
Der kann sehr gut automatisch mergen.
Wenn du zum Beispiel Dateien bearbeitest, die im Stamm gar nicht bearbeitet wurden,
dann musst du nichts weiter tun beim Merge.
Der macht das einfach automatisch und alles ist auf dem neuesten Stand.
Wenn du eine Datei bearbeitest, die auch im Stamm bearbeitet wurde, aber an einer anderen
Stelle der Datei, meinetwegen du hast den Header verändert und der andere hat den Footer
verändert, dann erkennt Git das auch automatisch und mergt die beiden Sachen einfach zusammen.
Es wird dann halt der neue Footer und der neue Header benutzt.
Bei Git musst du eigentlich nur manuell eingreifen, wenn irgendwo in derselben Zeile etwas verändert wurde.
Also wenn du in deinem Branch in einer Zeile was verändert hast und jemand anders hat
in dem Stamm in derselben Zeile in der Datei auch was verändert, dann kann Git natürlich
nicht entscheiden, was ist denn jetzt das Richtige.
Und dann musst du als Mensch eingreifen und sagen, ich will das oder das oder ich will
noch was Drittes, weil keins von beiden richtig ist.
Aber insgesamt ist dieses Branching und Merging mit Git sehr, sehr einfach und sehr, sehr
schnell und sehr fehlertolerant vor allem auch und das ist auch etwas, was Git wirklich
auszeichnet.
Branching und Merging ist mit Git super einfach und super gut unterstützt, also wenn du vielleicht
schon andere Versionsverwaltungssoftware kennen, wie zum Beispiel Subversion, das tut überhaupt
nicht weh, einen Branch anzulegen, im Gegenteil, das ist so schnell gemacht, dass es eigentlich
schon der Standard ist heutzutage, wenn ich ein neues Feature anlege, da gibt es zum Beispiel
eine Branching-Strategie, wo ich sage, für jedes Feature wird ein Branch angelegt und
am Ende wird das halt gemerged.
Und da gibt es die wildesten Sachen, wie man so ein Branching machen kann, da gibt es auch
gleich noch eine extra Frage zu, aber merkt ihr erstmal, das ist sehr, sehr billig, Git
kann das super schnell und ich kann jederzeit auch die Sachen wieder zurücknehmen und so
weiter, also da kann so gut wie nie was kaputt gehen, von daher ein zentrales Feature von
Git ist dieses Branching und Merging.
So, eine letzte Frage noch dazu, wie heißt denn jetzt der Standard-Branch in Git?
Ja, das muss ich irgendwie unterscheiden können, wenn ich jetzt für jedes Feature einen einzelnen
Branch habe und ich will das wieder in den Stamm zurückbringen, wie heißt denn jetzt
der Branch für den Stamm?
Und in Git heißt dieser Standard-Branch Master, das heißt, wenn du das mal irgendwo liest,
das ist quasi der Stamm deiner Entwicklung, dein zentraler Branch, auf dem gearbeitet wird.
Bei Subversion heißt der anders, da heißt der tatsächlich Trunk, also wirklich wie
bei einem Baum, der Trunk, das ist der Stamm, das ist das englische Wort dafür und bei
Git haben sie den Wortlaut nicht übernommen, ich weiß nicht warum, da heißt er jetzt
einfach Master, bei Subversion heißt er halt Trunk.
Okay, und letzte Frage zu Git, Nummer 22 auf der Liste, was ist ein Tag?
Einen Tag, das kennst du bestimmt, das ist so ein Schlagwort, das kann man zum Beispiel
Blockartikeln wunderbar hinterlegen, mache ich auch mal bei meinen Blockartikeln, so
ein Schlagwort halt einfach vergeben und das Ganze kann man auch bei Git machen.
Was ist jetzt ein Tag bei Git?
Gibt es aber auch in anderen Versionsverwaltungssystemen wie Subversion.
Ein Tag, das ist einfach nur ein Zeiger auf einen ganz speziellen Commit, dem man einen
schönen Namen geben kann.
Als Beispiel, du hast deine Software fertig und machst jetzt das Release, Version 1.0,
dann kannst du den Commit, der alles das enthält für diese Version 1.0, den kannst du mit
einem Tag versehen, zum Beispiel v1.0 und dann kannst du jederzeit später einfach auf
diesen Stand zurück, du kannst nämlich diesen Tag-Namen zum Beispiel beim Checkout benutzen,
du kannst einfach sagen Git-Checkout v1.0 und musst dir dann nicht immer diese kryptischen
Hash-Namen merken.
Das heißt, es ist auch ganz oft so, dass bestimmte Commits wirklich auch einen Tag
bekommen, einen Namen, weil man sich diese Hashes halt einfach überhaupt nicht merken
kann.
Bei Subversion weiß ich vielleicht, achso, ja, Version 1.0, das war Revision 273, bei
Git ist es dann Revision a1bcfa und du weißt, worauf ich hinaus will, das kann sich kein
Mensch merken, von daher kann man mit einem Befehl Git Tag und dann den Namen, diesem
Commit einen Namen geben, der erscheint dann zum Beispiel auch in der Log-Ausgabe und
du kannst dann damit einen Checkout machen und was du sonst auch immer machen willst
mit Git, überall kannst du das halt benutzen und eben sprechende Befehle benutzen.
Okay, das soll es jetzt erstmal zu Git gewesen sein, ich habe eine ganze Menge hier jetzt
schon behandelt in der fast einen Stunde, die ich jetzt rum habe insgesamt.
Ich könnte noch viel, viel mehr erzählen, es gibt noch so viele Begriffe und Befehle,
die man mit Git mitmachen kann und so weiter, aber es ist sinnvoll erstmal selber damit
anzufangen.
Ich kann nur kurz sagen, mit Git kannst du noch die wildesten Dinge tun, die du dir jetzt
noch gar nicht vorstellen kannst, warum du es überhaupt brauchen solltest, ja.
Es ist mit Git wirklich fast alles möglich, ist ein ganz, ganz tolles Tool, aber irgendwo
mache ich jetzt hier mal Schluss und das ist jetzt hier erreicht.
Ich glaube, wenn man die paar Sachen, diese insgesamt 22 Fragen beantworten kann, dann
kann man schon mal, so sage ich mal, bei der Arbeit das Git vernünftig nutzen, man weiß
die wichtigsten Sachen, wie ich Sachen einchecken kann, auschecken kann und so weiter und alles,
was jetzt noch oben drauf kommt, kannst du dir gerne angucken und solltest du auch, für
mich ist Git ein ganz, ganz wichtiges Werkzeug und das sollte man auch meistern tatsächlich
als Softwareentwickler, weil es einfach so toll bei der Entwicklung einen unterstützt.
Aber irgendwo muss ich mal aufhören, deswegen ist hier jetzt Feierabend, aber ich habe zum
Abschluss der Episode noch fünf zusätzliche Fragen, die du dir unbedingt stellen solltest,
wenn du in deinem Betrieb, also in deinem Ausbildungsbetrieb oder Unternehmen Git einsetzen
solltest oder auch irgendeine andere Visumsverwaltungssoftware, ist ganz egal, aber das musst du unbedingt klären,
du vernünftig damit arbeiten kannst und die gehen wir jetzt noch mal kurz durch.
Meine fünf Fragen zum Ausbildungsbetrieb und das ist die Nummer eins auf meiner Liste.
Wie gesagt, ich habe diese Liste meinem eigenen Azubi gegeben, er sollte das mal klären und
die Idee dahinter war, dass er jetzt auch mal mit ein paar anderen Kollegen ins Gespräch kommt und
mal fragt, sag mal, was machen wir denn mit Git und so weiter. Einfach mit den Leuten mal so ein
bisschen ins Gespräch kommt, denn diese Sachen kann man natürlich nicht im Internet recherchieren,
die kann nur dein Unternehmen dir beantworten. Das ist jetzt auch genau der Sinn hinter diesen
Fragen. Und Nummer eins auf dieser Liste ist, wofür setzt dein Unternehmen überhaupt Git oder
Subversion ein? Wird das überhaupt schon eingesetzt und wenn ja, wofür? Was macht ihr damit? Bei uns
ist es zum Beispiel so, dass sogar der Fachbereich Subversion einsetzt, um Dokumente zu versionieren,
meinetwegen Druckstücke von irgendwelchen Tarifen, dass man sich die Unterschiede noch
mal angucken kann oder eine Version von 1998 noch mal aufmachen kann und so weiter. Git setzen wir
für so ziemlich alles andere ein, Sourcecode, Textdokumente, LaTeX kann man damit versionieren
und so weiter. Und das ist eine wichtige Frage, wo wird das überhaupt schon eingesetzt bzw. was
für Software setzt ihr sonst ein? Setzt ihr vielleicht Team Foundation Server ein oder
Mercurial oder was auch immer? Das ist erstmal Punkt Nummer eins auf der Liste. Darfst du es
überhaupt benutzen oder benutzt ihr zum Beispiel was ganz anderes? Dann die zweite Frage, ganz
konkret, war jetzt auch mit so einem kleinen Arbeitsauftrag verbunden. Was musst du tun,
um Git an deinem eigenen Arbeitsplatz nutzen zu können? Ist das zum Beispiel schon vorinstalliert?
Habt ihr vielleicht eine Softwareverteilung, die das automatisch macht? Musst du das erstmal
runterladen, konfigurieren, einstellen, bla und blub? Oder gibt es da irgendwas Fertiges,
wo du noch auf den Knopf drücken musst? Das ist eine konkrete Frage, die du für dich klären musst,
am besten mit deinem entsprechenden Admin-Kollegen oder Ausbilder oder Arbeitsplatznachbarn oder was
auch immer. Was ist notwendig, damit du in deinem Unternehmen überhaupt diese Versionsverwaltungssoftware
nutzen kannst? Bei uns ist es zum Beispiel so, für Subversion haben wir einen grafischen
Client, nämlich Tortis SVN. Das ist so der Standard-Client, den man erstmal installiert
haben muss. Git benutzen wir als Kommando-Zahlen-Werkzeug. Das muss man auch über
eine Softwareverteilung erstmal installieren und so weiter. Das heißt, das musst du für dich
konkret klären. Was sind die Schritte, damit du auf deinem Arbeitsplatz überhaupt mit Git in diesem
Fall arbeiten kannst? Dann die dritte Frage. Du hast jetzt Git installiert, weißt jetzt auch,
wofür es benutzt wird. Das ist toll, aber was gibt es denn jetzt zum Beispiel für Repositories in
deinem Unternehmen, mit denen du arbeiten kannst oder auch darfst? Gibt es da vielleicht eine
rechte Verwaltung oder sonst was? Und die zentrale Frage ist, wo findest du denn diese Repositories?
Muss man die auswendig kennen, weil das jeder so einfach weiß, der in diesem Unternehmen arbeitet?
Oder gibt es vielleicht einfach eine Web-Oberfläche, wo du dir die Repos anschauen kannst? Bei uns ist
es zum Beispiel so, dass wir eine Java-Software im Einsatz haben, die so ein bisschen als Hosting
für die Git-Repos dient. Und da kann ich mich einfach anmelden mit meinen Windows-Benutzerdaten,
ist ansat-d integriert und da kann ich alle Repos sehen, die es bei uns gibt. Und dann weiß ich
halt, ich kann da drin suchen, ich kann sortieren, ich kann mir die letzten Commits angucken, die
DIVs sogar und so weiter. Das ist eine schöne Web-Plattform für die Verwaltung von Git-Repos.
Und wenn ich gar nicht weiß, dass es die gibt, ja, dann finde ich auch kein Repo bei uns im
Unternehmen. Das fällt einem ja nicht automatisch ein. Und deswegen unbedingt nachfragen, wo kann
man sich so eine Liste angucken? Oder wo ist das definiert? Wo sind die Rechte definiert? Wo kann
man sich so etwas anschauen bei euch im Unternehmen? Dann die Frage 4 zielt ab auf die guten
Commit-Nachrichten, die ich schon angesprochen habe. Gibt es bei euch im Unternehmen Regeln
für Commit-Nachrichten, an die du dich halten musst? Ist das zum Beispiel alles auf Englisch
zu formulieren oder auf Deutsch? Ist das eher aktiv oder passiv oder gibt es da irgendwelche
Regeln, an die du dich halten musst? Bei uns im Unternehmen ist es zum Beispiel so, dass wir für
bestimmte Repositories die Regel haben, dass es keine Commit-Nachricht ohne eine Ticket-Nummer gibt.
Bei uns müssen alle Änderungen an der Software in einer Ticket-Software, also in einem Bug-Tracker
quasi nachvollzogen werden können. Und das heißt, es ist Pflicht in jedem Commit eine
Ticket-Nummer anzugeben. Wenn die nicht da drin ist, dann haben wir das technisch sogar so gelöst,
dass du gar nicht committen kannst, weil ein Skript prüft, ob eine gültige Ticket-Nummer
angegeben wurde. Und wenn es bei dir auch entsprechende Regeln gibt und du kennst die
nicht, ja, dann hast du vielleicht toll gearbeitet, kriegst es aber gar nicht ins Repo rein, weil
irgendein Skript sagt, hey, du hast da Müll angegeben. Also unbedingt mal klären, gibt es
bei dir konkrete Regeln für Commit-Nachrichten? Und die letzte Frage Nummer 5 auf meiner Liste
für den Ausbildungsbetrieb ist, welche Branching-Strategie verfolgt dein Unternehmen? Denn ich
hatte schon angesprochen, es gibt relativ viele unterschiedliche Branching-Strategien, die sich
auch sehr stark unterscheiden in der kompletten Arbeitsweise. Also es gibt Leute, die halt für
jedes kleine Feature ein Branch aufmachen, dann gibt es auch sowas wie, wir arbeiten nur im Stamm,
es gibt gar keine Branches, ja. Und das hat alles aber seine Vor- und Nachteile. Man kann nicht sagen,
das eine ist richtig, das andere ist falsch, es kommt immer aufs Unternehmen an. Und bevor du dir
jetzt an irgendeinem Podcast meinetwegen anhörst, es ist supergeil, Feature-Branches zu benutzen und
in deinem Unternehmen wird das aber gar nicht so gemacht, dann kannst du ganz schnell mit deinen
Kollegen dir in die Quere kommen und eventuell sogar was kaputt machen. Also bevor du irgendwas
committest, frag unbedingt nach, wie das mit den Branches aussieht. Musst du Branches benutzen? Wenn
ja, wie müssen die heißen? Gibt es da eine bestimmte Vorgabe und so weiter? Und das solltest
du unbedingt mit deinen Kollegen klären, bevor du irgendwie anfängst und im Repository rumdokterst.
Das ist keine gute Idee, würde ich unbedingt vermeiden wollen. Okay, ja, die Fragen habe ich meinem
Azubi auch mitgegeben und ich denke, wenn man die alle geklärt hat und auch mit Git schon mal
gearbeitet hat, vielleicht das Tutorial durchgearbeitet hat, dann ist man sehr gut aufgestellt
und kann wenigstens schon mal anfangen. Und der Rest, habe ich schon gesagt, das kommt dann beim
Doing, wenn ich dann eine ganz konkrete Anforderung habe, so, oh, ich habe in dem Commit vor drei
Commits irgendwie eine Datei vergessen, die muss jetzt aber noch da rein und auch in alle Folge
Commits kann man alles mit Git machen, will ich aber hier nicht im Detail besprechen. Ich sage nur,
das Ding ist wirklich super, super mächtig und man kann Monate oder auch Jahre damit verbringen,
dieses Tool zu meistern. Also fang früh damit an, dann unterstützt es dich auf jeden Fall auch bei
der Entwicklung. Ja, damit bin ich für die Einführung in Git jetzt fertig. Ich hoffe, es sind die
wichtigsten Sachen so ein bisschen rübergekommen. Ich werde auf jeden Fall die beiden Episoden jetzt
letzte Woche und diese Woche auch in Zukunft meinen Azubis und Studenten empfehlen, damit ich
nicht immer wieder das Gleiche erzählen muss. Wenn ich noch mal irgendwas zu ergänzen habe,
gibt es vielleicht noch mal eine dritte Episode, aber für mich ist das jetzt erst mal abgehakt,
das Thema Git und von daher, ich hoffe, es war für dich ein bisschen was Sinnvolles, was
Lehrreiches dabei. Wenn du irgendwas zu ergänzen hast, schreib mir gerne einen Kommentar zur Episode
oder schreib mir eine Mail, kannst mich auf tausend verschiedene Arten erreichen, kannst einfach mal
auf der Website vorbeischauen. Nochmal der Hinweis, die Shownotes zur Episode findest du unter
anmeldungsentwicklerpodcast.de slash 77 für die heutige Episode 77 und wenn du dich für mein
Newsletter anmeldest unter anmeldungsentwicklerpodcast.de slash Newsletter, dann kannst du dir auch die
gesamten Fragen, die ich hier und heute und letzte Woche gestellt habe als Markdown-Datei runterladen
und die zum Beispiel, was weiß ich, mit deinem eigenen Azubi durchgehen, wenn du Ausbilder bist
oder wie gesagt selber, während du das Tutorial abarbeitest, versuchen die Fragen zu klären und
danach nochmal die Episoden anhören, um zu gucken, ob du es richtig verstanden hast. Das sind so
Möglichkeiten, die man vielleicht damit umsetzen kann. Okay, ansonsten sage ich für diese Episode
heute vielen, vielen Dank fürs Zuhören und bis zum nächsten Mal. Tschüss!










Neueste Kommentare