diff --git a/materials/sheet_local.typ b/materials/sheet_local.typ index b61cd08d2db08d921d46d550caaf0f5eb89e4997..ad457df65ba8acc2d9dd738252551f23c1aa9bd0 100644 --- a/materials/sheet_local.typ +++ b/materials/sheet_local.typ @@ -11,21 +11,21 @@ = Init -Open the downloaded project dir `greekify` in a terminal. -You should have a file `greekify.py` and `greekify_replace.py` in it. - -Calling `git status` should give you an eror message telling you, that neither this nor any upper directory is a git repository. -Du kannst das Git-Repository immer aus allen Unterverzeichnissen ändern, git sucht automatisch in den höher liegenden Verzeichnissen nach Repositories. +Öffnet das Projekt `greekify` das ihr per Mail bekommen habt in einem Terminal. +In diesem sollten sich die Dateien `greekify.py`, `greekify_replace.py` und `test.txt` befinden. +Der Befehl `git status` zeigt grundsätzlich an, in welchem Zustand sich das Repository gerade befindet. +Aktuell sollte `git status` eine Fehlermeldung anzeigen, dass weder das aktuelle noch irgendein höher liegendes Verzeichnis ein Git-Repository ist. ``` fatal: not a git repository (or any parent up to mount point /) ``` +Du kannst das Git-Repository immer aus allen Unterverzeichnissen ändern, git sucht automatisch in den höher liegenden Verzeichnissen nach Repositories. #task[ Erstelle ein git-repository im aktuellen Verzeichnis mit `git init`. ] Anschließend sollte sich ein `.git` Verzeichnis in dem `greekify` Verzeichnis befinden. -Die Ausgabe von `git log` zeigt dir nun das du auf dem aktuellen Branch (standardmäßig "main" genannt) keine Commits hast. +Die Ausgabe von `git log` zeigt dir nun, dass du auf dem aktuellen Branch (standardmäßig "main" genannt) keine Commits hast. ``` fatal: your current branch 'main' does not have any commits yet @@ -50,11 +50,10 @@ nothing added to commit but untracked files present (use "git add" to track) ``` = Add -Der nächste Schritt beim Bearbeiten ist das Tracken von Dateien. +Der nächste Schritt ist das Tracken von Dateien. #task[ - Tracke alle Dateien mit `git add greekify.py greekify_replace.py test.txt`. - Alternativ kannst du auch `git add .` verwenden um alle Dateien im aktuellen Verzeichnis (genannt `.`) hinzuzufügen. + Tracke die $3$ Dateien mit `git add`. Als Argument akzeptiert `git add` eine Liste von Dateien oder Verzeichnissen. ] Du kannst mit `git status` wieder anzeigen, welchen Zustand die Dateien haben. @@ -65,18 +64,18 @@ Dabei sollte nun angezeigt werden, das die Programm- und Testdateien beim nächs ] = Commit -Um die Änderung auch ins repository zu übernehmen, kannst du `git commit` verwenden. +Um die Änderung auch ins Repository zu übernehmen, kannst du `git commit` verwenden. Dazu musst du zuerst 2 Konfigurationen setzen. Zum einen solltest du zum Bearbeiten der Commit-Message einen Texteditor verwenden und musst Git dafür mitteilen, welchen Editor du verwenden möchtest. -Zum anderen wird bei Commits der Autor gespeichert, dazu musst du Git mitteilen welche Informationen dafür verwendet werden sollen. +Zum anderen wird bei Commits der Autor gespeichert, dazu musst du Git mitteilen welcher Name und Kontaktdaten dafür verwendet werden sollen. Konfigurationen werden mit dem Kommando `git config` geändert. Mit der Flag `--global` setzt du sie global, ohne wird die Änderung nur für das lokale Repository geändert. #footnote[Alternativ kannst du die Datei, in der die Konfiguration gespeichert ist, auch direkt bearbeiten. In unix-artigen Systemen befindet sich die globale config in `$HOME/.gitconfig` und die Repository-lokale config in `./.git/config`] Mögliche Editoren: -- Nano (einfach gehalten, empfohlen für Einstiger, das `^` in der Befehlsübersicht steht für die `Strg`-Taste)\ +- Nano (einfach gehalten, empfohlen für Einstiger; das `^` in der Befehlsübersicht steht für die `Strg`-Taste)\ `git config --global core.editor /bin/nano` - Vim (Sehr interessanter Editor dessen Benutzung den Rahmen dieses Workshops weit sprengt)\ `git config --global core.editor /bin/vim` @@ -100,7 +99,7 @@ git config user.email "dein.name@rwth-aachen.de" ] #task[ - Commit die getrackten Änderung mit `git commit`. Dies sollte den zuvor konfigurierten Texteditor öffen, mit einer Übersicht. + Commit die getrackten Änderung mit `git commit`. Dies sollte den zuvor konfigurierten Texteditor öffen, mit einer Übersicht der geänderten Dateien. Lies dir die generierten Kommentare dort in Ruhe durch. Schreibe anschließend eine Commit-Message in die erste Zeile. Trage erstmal irgendeine Message ein, wir kommen später dazu wie eine gute Commit-Message aussieht. @@ -177,17 +176,17 @@ Bei der Commit-Id genügen die ersten 7 Zeichen, im oberen Beispiel wäre der Be Falls du das Programm zwischenzeitg ausführst und dabei ein `__PYCACHE__`-Verzeichnis entsteht, committe dieses nicht. ] -Der `git log` Befehl kann dir auch nur das log für ausgewählte Dateien anzeigen. +Der `git log` Befehl kann das Log auch auf ausgewählte Dateien beschränken. Die Syntax dafür ist `git log -- Datei1 Datei2`. #question[ - Was sollte anschließend die Ausgabe von `git log -- greekify_replace.py` und `git log -- greekify.py` sein? Warum? + Was sollten `git log -- greekify_replace.py` und `git log -- greekify.py` jetzt anzeigen? Warum? ] = .gitignore -Beim Ausführen des Programs sollte ein `__PYCACHE__`-Verzeichnis entstehen. -Dieses gehört wie alle Cache-Dateien und andere automatisch generierte Dateien nicht ins Git-Repository. -Um Git darüber zu informieren kannst du ein .gitignore Datei anlegen. +Beim Ausführen des Programms sollte ein `__PYCACHE__`-Verzeichnis entstehen. +Dieses gehört wie alle automatisch generierte Dateien nicht ins Git-Repository. +Um Git darüber zu informieren, kannst du ein .gitignore Datei anlegen. In dieser kannst du zeilenweise Dateien eintragen die ignoriert werden sollen. Wenn Git eine Datei ignoriert wird sie nicht in `git status` als untracked angezeigt und `git add` auf einem höherliegenden Verzeichnis fügt sie nicht hinzu. @@ -196,7 +195,7 @@ Wenn Git eine Datei ignoriert wird sie nicht in `git status` als untracked angez Lege eine `.gitignore`-Datei an, nach der das `__PYCACHE__`-Verzeichnis ignoriert wird. Bei Erfolg sollte `git status` die Datei nicht mehr als untracked anzeigen. Darüber hinaus sollte `git log -- __pycache__` keine Commits anzeigen, andernfalls hast du `__PYCACHE__` - aus Versehen getrackt und Comitted. + aus Versehen getrackt und comitted. ] #info[ .gitignore akzeptiert auch Wildcards, also Sonderzeichen die es ermöglichen mehrere Dateien in einer Zeile abzudecken. @@ -209,11 +208,52 @@ Wenn Git eine Datei ignoriert wird sie nicht in `git status` als untracked angez #warning[ Automatisch generierte Dateien gehören nicht ins Git-Repository. Nicht nur weil das unnötig Speicher wegnimmt, sondern auch weil die von Menschen vorgenommenen Änderung in der Flut an geänderten generierten Dateien untergehen. - Bei Dateien, die nur teilweise automatisch generiert sind (z.B. `Cargo.lock` in Rust Projekten), kann es hingegen schon sinnvoll sein, + Bei nur teilweise automatisch generiert Dateien (z.B. `Cargo.lock` in Rust Projekten), kann es hingegen schon sinnvoll sein, sie im Git-Repository zu tracken. ] += Diff +Der Befehl `git diff` gibt den Unterschied zwischen zwei Versionen aus. +Beispielsweise gibt `git diff 7120114` an, was sich seit Commit `7120114` geändert hat. +Alternativ akzeptiert `git diff` auch Ranges und Dateien, z.B. gibt `git diff 1f44746..7120114 -- csv-core/src/writer.rs` an, +was sich von Commit `1f44746` zu Commit `7120114` in der Datei `csv-core/src/writer.rs` geändert hat. + +#task[ + Diese und die folgenden Aufgaben beziehen sich das `rust-csv` Projekt. + #set enum(numbering: "a)") + 1. Finde mit `git diff` heraus, was sich in den letzten $20$ Commits an der Datei `src/tutorial.rs` geändert hat. + 2. Auch `git log` akzeptiert Ranges. + Finde mit `git log` heraus, welche der letzten $20$ Commits die Datei `src/tutorial.rs` geändert haben. +] + +#optional-task[ + Wie viele Dateien wurden in den letzten $100$ Commits geändert? + Öffne mit `man git-diff` das Manual für den `git diff` Befehl. + Durchsuche die Optionen für eine Option mit der du die Aufgabe einfach lösen kannst. +] + += Checkout +Mit `git checkout` kannst du alte Versionen in deine Working-Area laden. +Z.B. lädt der Befehl `git checkout 1234567` Commit `1234567`. + +#task[ + Wir viele Zeilen hatte die Datei `README.md` in Commit `77fdafe`? +] +#question[ + Was macht `git checkout HEAD`? +] + = Zusammenfassung +Eine Version in Git heißt Commit. Jeder Commit wird anhand eines Hashes eindeutig identifiziert. +Der Hash kann meist mit den ersten $7$ Zeichen abgekürzt werden. + +Nach diesem Aufgabenblatt solltest du mit den folgenden Befehlen grundlegend vertraut sein: +- `init` +- `add` +- `commit` +- `log` +- `diff` +- `checkout` #optional-task[ Wiederhole die Übungen in einem neuen Verzeichnis mit der Entwicklungsumgebung deiner Wahl diff --git a/materials/slides.typ b/materials/slides.typ index 279d38a73beaab256931717dd4f026768050982f..c89e54ab47789bf857a8706a7b76c60e3573a6e2 100644 --- a/materials/slides.typ +++ b/materials/slides.typ @@ -192,7 +192,11 @@ #let (uncover, only, alternatives) = utils.methods(self) #alternatives[ #align(center)[ - `git init` & `git commit` + `git init` + ] +][ + #align(center)[ + `git commit` ] #fletcher.diagram( node-stroke: 1pt,