# Tutorial 4: Version Control, Code Review ASE WS 2023/24 ## Rückschau ## Version Control Was Du können bzw. verstanden haben solltest: * Grundlagen Versionskontrolle mit Git auf der Kommandozeile (Repo einrichten oder klonen, Commits, Push/Pull) * Zugriff auf git.ur.de ## Setup Ihr könnt die Aufgaben auf Eurer lokalen Shell erledigen, wenn dort Git installiert ist. Oder: als Nutzer `root` auf einem 'disposable root server' [via segfault.net](https://blog.thc.org/disposable-root-servers). ssh root@segfault.net # Password is 'segfault' **Achtung:** Der Server ist nicht sicher - keine vertraulichen Infos/Passwörter dort eintippen Erster Schritt auf dem Server: Informationen zu Netzwerk-Schnittstellen prophylaktisch in einen Text-Editor kopieren Zweiter Schritt: tmate installieren und ausführen. apt install tmate tmate `tmate` startet eine `tmux`-Session und gibt Pfade/Befehle aus, mit denen man der Session remote beitreten kann. Diese Infos am Besten auch in einem Texteditor speichern und 'q' drücken. ## Git-Basics Finde heraus, was folgende Befehle machen: * git init * git clone * git commit (--amend) * git push / pull * git reset (--hard) * git checkout (-b) * git tag * git log * git blame * git rebase (see also [jvns.ca: rebasing - what can go wrong?](https://jvns.ca/blog/2023/11/06/rebasing-what-can-go-wrong-/) * git bisect * git cherry-pick * [git absorb](https://github.com/tummychow/git-absorb) Bearbeitet zu zweit die Git-Übungen von [Julia Evans](https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/) **Aufgabe:** * Bearbeite die Git-Katas von https://github.com/eficode-academy/git-katas * Bearbeite das Tutorial zu Git Branches: https://learngitbranching.js.org/ ## Git Workflows Notwendige Vorkenntnisse: Git Basics (Raphael demonstriert ein bisschen was zu GitLab und CI/CD) **Aufgabe (Zweiergruppe):** * lest https://www.atlassian.com/continuous-delivery/continuous-integration und die Unter-Kapitel * lest die GitLab-Dokumentation zu CI/CD * Lest jeweils den Code im Building-Manager-Projekt der anderen Person und schlagt Änderungen vor (z.B. Kommentare, Refactoring): - erzeugt jeweils einen neuen Feature-Branch und checkt diesen aus - nehmt Eure Änderungen vor - verwendet sinnvolle Commit-Messages - erzeugt einen Merge-Request - reviewt die Merge-Requests der anderen Person und mergt die Feature-Branches in den Main-Branch - führt diesen Prozess einmal über das UI und einmal über die Kommandozeile durch (Merge Request dann informell) * Baut eine CI/CD-Pipeline, die automatisch die Dokumentation der Anwendung erzeugt und Tests laufen lässt. (Tipp: verwendet das Python-Template von GitLab) ## Alternative Versionskontrollsysteme Git ist inzwischen das meistverbreitete Werkzeug zur Versionskontrolle. Es gibt allerdings einige Alternativen, die eleganter, benutzerfreundlicher und/oder performanter sind. Beispiele: * [Fossil](https://www.fossil-scm.org/home/doc/trunk/www/index.wiki) von den Entwicklern von sqlite * [Mercurial](https://www.mercurial-scm.org/) (siehe auch: [Diskussion zu Facebook's Sapling](https://news.ycombinator.com/item?id=33612410)) * [Perforce](https://www.perforce.com/) / Helix Core (kommerziell, gut für Binärdateien) * [jujutsu /jj](https://github.com/martinvonz/jj) - spannender neuer Ansatz, kann transparent mit Git-Repos arbeiten **Aufgaben**: * Lies Hacker-News-Kommentare zu diesen Systemen und fasse die wichtigsten Aspekte in Stichpunkten zusammen * Installiere Fossil und Mercurial, klone ein existierendes Repository und mache einen lokalen Commit in einer Datei. Vergleiche Laufzeit und Speicherbedarf informell. Weiterführende Quellen: * [Julia Evans' Blog](https://jvns.ca/) * [Git Zine von Julia Evans](https://wizardzines.com/zines/oh-shit-git/) * [Befehle um Git-Objekte in Dateien aufzulösen und umgekehrt](https://news.ycombinator.com/item?id=37514301) * https://ohshitgit.com/ * Repos mit Branches: * https://github.com/opencv/opencv * https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition/