Anhang A: Git und GitLab
Ab dem III. Jahrgang geben Sie Ihre Übungen nicht mehr per MS Teams, Mail oder USB-Stick ab, sondern über Ihr eigenes Repository in GitLab. Diese Seite erklärt Schritt für Schritt, was Sie dafür brauchen. Sie müssen dafür nichts über Git wissen: Wenn Sie die Befehle der Reihe nach eintippen, funktioniert es.
Worum geht es überhaupt?
Abschnitt betitelt „Worum geht es überhaupt?“Stellen Sie sich ein Videospiel mit Speicherständen vor. Immer wenn Sie einen Abschnitt geschafft haben, speichern Sie. Geht danach etwas schief, laden Sie einfach den letzten Speicherstand. Genau das macht Git mit Ihren Programmen: Es merkt sich jeden Speicherstand Ihres Projekts, und Sie können jederzeit nachsehen, was sich wann geändert hat.
GitLab ist eine Webseite (gitlab.com), auf der Ihre Speicherstände zusätzlich online liegen. Das hat zwei Vorteile: Ihre Arbeit ist gesichert, auch wenn der Laptop kaputtgeht, und Ihre Lehrkraft kann Ihre Übungen dort ansehen.
flowchart LR
PC["Ihr Computer<br/>(lokales Repository)"]
GL["GitLab<br/>(Repository online)"]
GL -- "git clone<br/>(einmal herunterladen)" --> PC
PC -- "git push<br/>(hochladen)" --> GL
GL -- "git pull<br/>(Neues holen)" --> PC
Die wichtigsten Wörter, die Ihnen auf dieser Seite begegnen:
| Begriff | Bedeutung | Vergleich |
|---|---|---|
| Repository (kurz Repo) | Ein Projektordner, den Git überwacht | Ihr Spielstand-Ordner |
| Clone | Das Repo einmal von GitLab auf den Computer kopieren | Das Spiel installieren |
| Commit | Ein gespeicherter Stand mit einer kurzen Beschreibung | Ein Speicherstand |
| Push | Ihre Commits zu GitLab hochladen | Speicherstand in die Cloud laden |
| Pull | Neue Commits von GitLab herunterladen | Speicherstand aus der Cloud holen |
| Tag | Ein Namensschild, das an einem Commit klebt | Ein Lesezeichen mit Aufschrift |
Die Regeln für Ihr Repository
Abschnitt betitelt „Die Regeln für Ihr Repository“Ihr Repository wurde bereits für Sie in GitLab angelegt. Darin bekommt jede Übung einen eigenen Ordner. Der Ordnername besteht aus drei Teilen:
- einem Buchstaben:
sfür Schulübung oderhfür Hausübung, - einer zweistelligen Nummer mit führender Null:
01,02, …09,10,11, … - einem Bindestrich und dem Thema, klein geschrieben, ohne Leerzeichen und ohne Umlaute.
So sieht ein Repository nach ein paar Wochen aus:
Ordnermuster-max/
Ordners01-einfuehrung/
- main.py
Ordners02-datentypen/
- main.py
Ordners03-verzweigungen/
- main.py
- aufgabe2.py
Ordnerh01-hello-world/
- main.py
Ordnerh02-input-output/
- main.py
| Richtig | Falsch | Warum falsch? |
|---|---|---|
s01-einfuehrung | s1-einfuehrung | Die führende Null fehlt |
s02-datentypen | s02 - Datentypen | Leerzeichen und Großbuchstaben |
h03-schleifen-und-listen | h03-schleifen und listen | Leerzeichen statt Bindestrichen |
h04-uebungen | h04-übungen | Umlaut (schreiben Sie ae, oe, ue, ss) |
Fertige Hausübungen markieren Sie zusätzlich mit einem Tag. Das Tag besteht aus dem Ordnerkürzel (zum Beispiel h02), einem Unterstrich und ready:
| Hausübung (Ordner) | Tag, wenn sie fertig ist |
|---|---|
h01-hello-world | h01_ready |
h02-input-output | h02_ready |
h12-dateien | h12_ready |
Schulübungen bekommen kein Tag, außer die Aufgabe ist in Stufen aufgeteilt. Wie das Taggen genau geht, steht weiter unten im Abschnitt Hausübung abgeben.
Aufgaben mit Stufen
Abschnitt betitelt „Aufgaben mit Stufen“Viele Aufgaben sind in Stufen aufgeteilt: Wesentlich überwiegend, Wesentlich vollständig, PlusPlus und MandalorianPlus (die Stufe nach PlusPlus). Bei solchen Aufgaben setzen Sie für jede fertige Stufe ein eigenes Tag. Es besteht aus drei Teilen, verbunden mit Unterstrichen:
- dem Ordnerkürzel der Übung, zum Beispiel
h02für den Ordnerh02-input-output(bei einer Schulübung entsprechends03), - dem Kürzel der Stufe, die Sie gerade fertig haben (nur diese eine, nicht die Stufen davor),
- und
ready.
| Stufe fertig | Kürzel | Tag |
|---|---|---|
| Wesentlich überwiegend | g | h02_g_ready |
| Wesentlich vollständig | e | h02_e_ready |
| PlusPlus | pp | h02_pp_ready |
| MandalorianPlus | m | h02_m_ready |
Hat eine Aufgabe in der Angabe eine eigene Nummer (zum Beispiel 0200) und keinen eigenen Ordner in Ihrem Repository, verwenden Sie stattdessen diese Nummer: 0200_g_ready, 0200_e_ready usw.
Das Kürzel _g gehört immer dazu, auch wenn eine Aufgabe nur die Stufe Wesentlich überwiegend hat. Für MandalorianPlus war früher das Kürzel r üblich; verwenden Sie jetzt m.
Die Tags der früheren Stufen bleiben stehen. Wer bis PlusPlus kommt, hat am Ende also drei Tags: h02_g_ready, h02_e_ready und h02_pp_ready. So ist für jede Stufe einzeln sichtbar, wann sie abgegeben wurde.
Schritt 1: Git installieren
Abschnitt betitelt „Schritt 1: Git installieren“-
Öffnen Sie git-scm.com/downloads/win und laden Sie den Installer herunter (“64-bit Git for Windows Setup”).
-
Starten Sie den Installer. Sie können bei fast allen Fragen einfach auf Next klicken. Nur bei einer Frage lohnt sich eine Änderung: Bei “Choosing the default editor used by Git” wählen Sie “Use Visual Studio Code as Git’s default editor”.
-
Der Installer bringt automatisch den Git Credential Manager mit. Er kümmert sich später um die Anmeldung bei GitLab. Lassen Sie diese Einstellung so, wie sie ist.
-
Nach der Installation finden Sie im Startmenü das Programm Git Bash. Das ist ein Terminal, in dem alle Befehle dieser Seite funktionieren. Sie können genauso gut das Terminal in VS Code verwenden (Menü Terminal → Neues Terminal).
Öffnen Sie das Programm Terminal und tippen Sie git --version. Ist Git noch nicht installiert, bietet macOS automatisch an, die Command Line Developer Tools zu installieren. Bestätigen Sie mit Installieren, danach ist Git vorhanden.
Git installieren Sie über die Paketverwaltung, zum Beispiel unter Ubuntu oder Debian:
sudo apt install gitTest: Öffnen Sie ein Terminal und tippen Sie:
git --versionErscheint eine Versionsnummer, ist alles in Ordnung:
git version 2.51.0.windows.1Die genaue Nummer ist egal. Kommt stattdessen “command not found” oder “Der Befehl wurde nicht gefunden”, schließen Sie das Terminal, öffnen ein neues und versuchen es noch einmal. Hilft das nicht, starten Sie den Computer neu.
Schritt 2: Git einmalig einrichten
Abschnitt betitelt „Schritt 2: Git einmalig einrichten“Git möchte wissen, wer Sie sind, damit bei jedem Speicherstand Ihr Name steht. Das machen Sie einmal pro Computer. Ersetzen Sie Namen und Mail-Adresse durch Ihre eigenen:
git config --global user.name "Max Muster"git config --global pull.rebase falseDie dritte Zeile legt fest, wie Git beim Herunterladen vorgeht, wenn sich online und auf Ihrem Computer gleichzeitig etwas geändert hat. Sie müssen sie nicht verstehen; ohne sie zeigt Git später eventuell eine verwirrende Meldung.
Schritt 3: Das Repository klonen
Abschnitt betitelt „Schritt 3: Das Repository klonen“Klonen heißt: Sie holen sich Ihr Repository einmal von GitLab auf den Computer. Danach arbeiten Sie nur noch in diesem Ordner.
-
Adresse kopieren. Melden Sie sich auf gitlab.com an und öffnen Sie Ihr Repository. Klicken Sie rechts oben auf den blauen Knopf Code und kopieren Sie die Adresse unter Clone with HTTPS. Sie sieht ungefähr so aus:
https://gitlab.com/htl-sew/3ahit/muster-max.git -
Schulordner anlegen. Öffnen Sie ein Terminal und legen Sie einen Ordner an, in dem Ihre Schulsachen liegen sollen. Dann wechseln Sie hinein:
Terminal-Fenster mkdir ~/schulecd ~/schuleDas Zeichen
~steht für Ihren persönlichen Benutzerordner (unter WindowsC:\Users\IhrName). -
Klonen. Tippen Sie
git clone, ein Leerzeichen und fügen Sie die kopierte Adresse ein (in Git Bash mit Umschalt + Einfg oder Rechtsklick → Paste):Terminal-Fenster git clone https://gitlab.com/htl-sew/3ahit/muster-max.gitGit meldet so etwas wie:
Cloning into 'muster-max'...remote: Enumerating objects: 3, done.Receiving objects: 100% (3/3), done. -
In den Ordner wechseln. Git hat einen neuen Ordner mit dem Namen Ihres Repositorys angelegt. Wechseln Sie hinein und öffnen Sie ihn in VS Code:
Terminal-Fenster cd muster-maxcode .
Die Anmeldung bei GitLab
Abschnitt betitelt „Die Anmeldung bei GitLab“Beim ersten Klonen (oder spätestens beim ersten Push) fragt Git, wer Sie sind.
Unter Windows öffnet sich ein Fenster des Git Credential Manager. Klicken Sie auf Sign in with your browser. Im Browser melden Sie sich bei GitLab an und bestätigen mit Authorize. Fertig: Windows merkt sich die Anmeldung, und Sie werden nicht mehr gefragt.
Wenn das nicht klappt (oder unter macOS und Linux), verwenden Sie einen Personal Access Token. Das ist eine Art Ersatz-Passwort, das nur für Git gilt.
-
Klicken Sie in GitLab links oben auf Ihr Profilbild → Edit profile → Personal access tokens → Add new token.
-
Geben Sie einen Namen ein, zum Beispiel
laptop-schule, und wählen Sie ein Ablaufdatum (zum Beispiel das Ende des Schuljahres). -
Setzen Sie die Häkchen bei read_repository und write_repository und klicken Sie auf Create token.
-
Kopieren Sie den Token sofort und bewahren Sie ihn sicher auf. GitLab zeigt ihn nur dieses eine Mal an.
-
Fragt Git nach
Username, geben Sie Ihren GitLab-Benutzernamen ein. Fragt es nachPassword, fügen Sie den Token ein (nicht Ihr GitLab-Passwort). Beim Einfügen sehen Sie keine Zeichen; das ist normal.
Schritt 4: Eine Übung anlegen
Abschnitt betitelt „Schritt 4: Eine Übung anlegen“Angenommen, die erste Schulübung heißt „Einführung“. Sie legen dafür im Repository einen Ordner an:
mkdir s01-einfuehrungIn VS Code erstellen Sie in diesem Ordner die Datei main.py:
print("Hallo, ich bin Max!")Bis jetzt weiß Git nur, dass sich etwas geändert hat. Gespeichert ist noch nichts. Das kommt im nächsten Schritt.
Schritt 5: Einen Commit machen
Abschnitt betitelt „Schritt 5: Einen Commit machen“Ein Commit ist ein Speicherstand. Er entsteht in zwei Schritten, so wie ein Paket:
git add: Sie legen die Dateien in den Karton.git commit: Sie kleben den Karton zu und schreiben drauf, was drin ist.
Was hat sich geändert?
Abschnitt betitelt „Was hat sich geändert?“Bevor Sie etwas speichern, fragen Sie Git, was neu ist:
git statusOn branch mainUntracked files: (use "git add <file>..." to include in what will be committed) s01-einfuehrung/
nothing added to commit but untracked files presentGit sagt: Es gibt einen neuen Ordner s01-einfuehrung/, den ich noch nicht kenne (untracked).
Dateien einpacken
Abschnitt betitelt „Dateien einpacken“git add .Der Punkt bedeutet „alles in diesem Ordner“. Ein erneutes git status zeigt jetzt die Datei in Grün unter Changes to be committed:
On branch mainChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: s01-einfuehrung/main.pySpeichern
Abschnitt betitelt „Speichern“git commit -m "s01: Hallo-Welt-Programm geschrieben"Nach -m steht in Anführungszeichen die Nachricht: ein kurzer Satz, was Sie gemacht haben.
[main 3f2a1c9] s01: Hallo-Welt-Programm geschrieben 1 file changed, 1 insertion(+) create mode 100644 s01-einfuehrung/main.pyGeschafft, das war Ihr erster Speicherstand! Alle bisherigen Commits sehen Sie mit:
git log --oneline3f2a1c9 (HEAD -> main) s01: Hallo-Welt-Programm geschriebena81b0d4 Initial commit| Gute Commit-Nachricht | Schlechte Commit-Nachricht |
|---|---|
s02: Aufgabe 1 und 2 gelöst | asdf |
h01: Begrüßung mit Namen eingebaut | update |
h02: Fehler bei leerer Eingabe behoben | jetzt gehts |
Schritt 6: Pushen und Pullen
Abschnitt betitelt „Schritt 6: Pushen und Pullen“Push: hochladen
Abschnitt betitelt „Push: hochladen“Ihr Commit liegt bis jetzt nur auf Ihrem Computer. Damit er auch in GitLab ankommt, laden Sie ihn hoch:
git pushEnumerating objects: 4, done.Writing objects: 100% (4/4), 380 bytes | 380.00 KiB/s, done.To https://gitlab.com/htl-sew/3ahit/muster-max.git a81b0d4..3f2a1c9 main -> mainLaden Sie Ihr Repository in GitLab im Browser neu: Der Ordner s01-einfuehrung ist jetzt auch dort zu sehen.
Pull: Neues holen
Abschnitt betitelt „Pull: Neues holen“Angenommen, Sie arbeiten in der Schule am Schul-PC und zu Hause am eigenen Laptop. Beide haben eine Kopie des Repositorys. Was Sie in der Schule gepusht haben, ist zu Hause noch nicht da. Sie holen es mit:
git pullUpdating 3f2a1c9..7c4e2b1Fast-forward s02-datentypen/main.py | 12 ++++++++++++ 1 file changed, 12 insertions(+)Ist nichts Neues da, meldet Git Already up to date.
Ein typischer Arbeitstag
Abschnitt betitelt „Ein typischer Arbeitstag“So sieht eine ganze Stunde mit Schulübung 3 aus, von Anfang bis Ende:
cd ~/schule/muster-maxgit pull # 1. Neues holenmkdir s03-verzweigungen # 2. Ordner anlegen und programmieren ...git add . # 3. einpackengit commit -m "s03: Aufgabe 1 gelöst" # 4. speicherngit push # 5. hochladenDie Teile nach # sind Kommentare; die müssen Sie nicht mittippen.
Schritt 7: Hausübung abgeben (taggen)
Abschnitt betitelt „Schritt 7: Hausübung abgeben (taggen)“Wenn eine Hausübung fertig ist, kleben Sie ein Namensschild (Tag) auf den letzten Commit. Daran erkennt Ihre Lehrkraft: Diese Version ist die Abgabe.
Beispiel: Die Hausübung h02-input-output ist fertig.
-
Alles committen. Prüfen Sie mit
git status, dass nichts mehr offen ist. Sonst erstgit add .undgit commit.Terminal-Fenster git add .git commit -m "h02: Hausübung fertig" -
Commits hochladen.
Terminal-Fenster git push -
Tag setzen.
Terminal-Fenster git tag h02_readyDas Tag klebt jetzt am letzten Commit, aber nur auf Ihrem Computer.
-
Tag hochladen. Dieser Schritt wird am häufigsten vergessen! Ein normales
git pushlädt Tags nicht mit hoch:Terminal-Fenster git push origin h02_readyTo https://gitlab.com/htl-sew/3ahit/muster-max.git* [new tag] h02_ready -> h02_ready -
Kontrollieren. Öffnen Sie Ihr Repository in GitLab und klicken Sie links auf Code → Tags. Dort muss
h02_readystehen.
Ihre Tags auf dem Computer zeigt git tag an:
git tagh01_readyh02_readyAufgaben mit Stufen abgeben
Abschnitt betitelt „Aufgaben mit Stufen abgeben“Bei einer Aufgabe mit Stufen gehen Sie genauso vor, nur heißt das Tag nach der Stufe, die Sie gerade fertig haben. Ein zusätzliches Tag für die ganze Hausübung (h02_ready) brauchen Sie dann nicht. Beispiel: Erst ist Wesentlich überwiegend fertig, ein paar Tage später Wesentlich vollständig.
# Stufe "Wesentlich überwiegend" fertiggit add .git commit -m "h02: Wesentlich überwiegend fertig"git pushgit tag h02_g_readygit push origin h02_g_ready
# später: Stufe "Wesentlich vollständig" fertiggit add .git commit -m "h02: Wesentlich vollständig fertig"git pushgit tag h02_e_ready # neues Tag, h02_g_ready bleibtgit push origin h02_e_readyIn GitLab unter Code → Tags stehen danach beide Tags, jedes an seinem eigenen Commit.
Nachbessern: Tag löschen und neu setzen
Abschnitt betitelt „Nachbessern: Tag löschen und neu setzen“Sie haben h02_ready schon hochgeladen und bemerken noch einen Fehler? Dann löschen Sie das Tag, bessern nach und setzen es neu:
git tag -d h02_ready # 1. Tag auf dem Computer löschengit push origin --delete h02_ready # 2. Tag in GitLab löschen
# 3. Fehler ausbessern, dann wie gewohnt:git add .git commit -m "h02: Fehler bei leerer Eingabe behoben"git push
git tag h02_ready # 4. Tag neu setzengit push origin h02_ready # 5. Tag hochladenBei einer Aufgabe mit Stufen funktioniert das genauso, nur mit dem Tag der betroffenen Stufe (zum Beispiel h02_e_ready). Die Tags der anderen Stufen bleiben unverändert.
Spickzettel
Abschnitt betitelt „Spickzettel“| Was will ich? | Befehl |
|---|---|
| Repository einmal herunterladen | git clone https://gitlab.com/…/muster-max.git |
| Neues von GitLab holen | git pull |
| Nachsehen, was sich geändert hat | git status |
| Alle Änderungen einpacken | git add . |
| Speicherstand anlegen | git commit -m "s01: was ich gemacht habe" |
| Hochladen | git push |
| Bisherige Commits ansehen | git log --oneline |
| Hausübung als fertig markieren | git tag h02_ready |
| Stufe einer Aufgabe als fertig markieren | git tag h02_g_ready (Stufen: g, e, pp, m) |
| Tag hochladen | git push origin h02_ready |
| Tag löschen (Computer und GitLab) | git tag -d h02_ready und git push origin --delete h02_ready |
Häufige Fehlermeldungen
Abschnitt betitelt „Häufige Fehlermeldungen“fatal: not a git repository
Sie sind im falschen Ordner. Wechseln Sie mit cd ~/schule/muster-max in Ihr Repository.
Author identity unknown
Schritt 2 fehlt. Richten Sie user.name und user.email ein.
nothing to commit, working tree clean
Kein Fehler: Es gibt nichts Neues zu speichern. Haben Sie die Datei in VS Code gespeichert (Strg + S)?
! [rejected] main -> main (fetch first)
In GitLab gibt es Commits, die Sie noch nicht haben, zum Beispiel vom anderen Computer. Machen Sie zuerst git pull und danach noch einmal git push.
! [rejected] h02_ready -> h02_ready (already exists)
Das Tag gibt es in GitLab schon. Wenn Sie es neu setzen wollen, löschen Sie es vorher wie unter Nachbessern beschrieben.
Ein Fenster mit Text öffnet sich und Git wartet
Sie haben bei git commit das -m "…" vergessen. Git möchte die Nachricht im Editor haben: Schreiben Sie sie in die erste Zeile, speichern Sie und schließen Sie den Tab.
Für Fortgeschrittene: Anmelden mit SSH-Schlüssel
Abschnitt betitelt „Für Fortgeschrittene: Anmelden mit SSH-Schlüssel“Die Anmeldung über Browser oder Token funktioniert gut. Es gibt aber einen bequemeren Weg, den viele Profis verwenden: einen SSH-Schlüssel.
Stellen Sie sich ein Vorhängeschloss mit Schlüssel vor. Das Schloss (der öffentliche Schlüssel) geben Sie GitLab. Den Schlüssel dazu (den privaten Schlüssel) behalten Sie auf Ihrem Computer. Bei jedem Push zeigt Ihr Computer, dass er den passenden Schlüssel hat, und GitLab lässt Sie herein, ohne nach einem Passwort zu fragen.
Vorteile:
- Nie wieder Passwort oder Token eintippen. Push und Pull funktionieren einfach.
- Kein Ablaufdatum, an das man denken muss. Ein Token läuft irgendwann ab, ein SSH-Schlüssel nicht (außer Sie wollen es).
- Sicherer. Der private Schlüssel verlässt nie Ihren Computer. Selbst wenn jemand mitliest, erfährt er nichts, womit er sich anmelden könnte.
- Überall gleich. Unter Windows, macOS und Linux funktioniert es auf dieselbe Weise und auch bei anderen Diensten wie GitHub.
Nachteil: Die Einrichtung dauert einmalig ein paar Minuten, und jeder Computer braucht einen eigenen Schlüssel.
SSH-Schlüssel einrichten
Abschnitt betitelt „SSH-Schlüssel einrichten“-
Schlüssel erzeugen. Öffnen Sie ein Terminal (unter Windows Git Bash) und tippen Sie, mit Ihrer eigenen Mail-Adresse:
Terminal-Fenster Git fragt dreimal nach. Drücken Sie jedes Mal einfach Enter:
Enter file in which to save the key (/c/Users/Max/.ssh/id_ed25519):Enter passphrase (empty for no passphrase):Enter same passphrase again: -
Öffentlichen Schlüssel anzeigen. Der Schlüssel liegt jetzt in zwei Dateien. Für GitLab brauchen Sie die Datei mit der Endung
.pub(für public, öffentlich):Terminal-Fenster cat ~/.ssh/id_ed25519.pubssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHk3...Rk8 [email protected]Markieren und kopieren Sie die ganze Zeile.
-
In GitLab eintragen. Klicken Sie in GitLab auf Ihr Profilbild → Edit profile → SSH Keys → Add new key. Fügen Sie die Zeile in das Feld Key ein, geben Sie einen Titel wie
laptop-zuhauseein und klicken Sie auf Add key. -
Testen.
Terminal-Fenster Beim ersten Mal fragt das Terminal, ob Sie gitlab.com vertrauen. Tippen Sie
yesund Enter. Danach sollte erscheinen:Welcome to GitLab, @muster-max!
Repository auf SSH umstellen
Abschnitt betitelt „Repository auf SSH umstellen“Haben Sie Ihr Repository schon mit HTTPS geklont, stellen Sie es einmal um. In GitLab finden Sie unter Code → Clone with SSH die passende Adresse:
cd ~/schule/muster-maxKontrolle:
git remote -vorigin [email protected]:htl-sew/3ahit/muster-max.git (fetch)origin [email protected]:htl-sew/3ahit/muster-max.git (push)Ab jetzt funktionieren git pull und git push ohne Anmeldung. Auf einem neuen Computer können Sie gleich mit der SSH-Adresse klonen:
Weiterlesen
Abschnitt betitelt „Weiterlesen“Diese Seite zeigt nur das, was Sie für die Abgabe brauchen. Wie Git im Inneren funktioniert, was Branches sind und wie man im Team arbeitet, erklärt das Kapitel Versionsverwaltung mit Git im III. Jahrgang.