Zum Inhalt springen

Anhang A: Git und GitLab

Zu Zen-Modus wechseln

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.

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:

BegriffBedeutungVergleich
Repository (kurz Repo)Ein Projektordner, den Git überwachtIhr Spielstand-Ordner
CloneDas Repo einmal von GitLab auf den Computer kopierenDas Spiel installieren
CommitEin gespeicherter Stand mit einer kurzen BeschreibungEin Speicherstand
PushIhre Commits zu GitLab hochladenSpeicherstand in die Cloud laden
PullNeue Commits von GitLab herunterladenSpeicherstand aus der Cloud holen
TagEin Namensschild, das an einem Commit klebtEin Lesezeichen mit Aufschrift

Ihr Repository wurde bereits für Sie in GitLab angelegt. Darin bekommt jede Übung einen eigenen Ordner. Der Ordnername besteht aus drei Teilen:

  1. einem Buchstaben: s für Schulübung oder h für Hausübung,
  2. einer zweistelligen Nummer mit führender Null: 01, 02, … 09, 10, 11, …
  3. 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
RichtigFalschWarum falsch?
s01-einfuehrungs1-einfuehrungDie führende Null fehlt
s02-datentypens02 - DatentypenLeerzeichen und Großbuchstaben
h03-schleifen-und-listenh03-schleifen und listenLeerzeichen statt Bindestrichen
h04-uebungenh04-übungenUmlaut (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-worldh01_ready
h02-input-outputh02_ready
h12-dateienh12_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.

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:

  1. dem Ordnerkürzel der Übung, zum Beispiel h02 für den Ordner h02-input-output (bei einer Schulübung entsprechend s03),
  2. dem Kürzel der Stufe, die Sie gerade fertig haben (nur diese eine, nicht die Stufen davor),
  3. und ready.
Stufe fertigKürzelTag
Wesentlich überwiegendgh02_g_ready
Wesentlich vollständigeh02_e_ready
PlusPluspph02_pp_ready
MandalorianPlusmh02_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.

  1. Öffnen Sie git-scm.com/downloads/win und laden Sie den Installer herunter (“64-bit Git for Windows Setup”).

  2. 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”.

  3. 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.

  4. 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).

Test: Öffnen Sie ein Terminal und tippen Sie:

Terminal-Fenster
git --version

Erscheint eine Versionsnummer, ist alles in Ordnung:

git version 2.51.0.windows.1

Die 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.

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:

Terminal-Fenster
git config --global user.name "Max Muster"
git config --global user.email "[email protected]"
git config --global pull.rebase false

Die 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.

Klonen heißt: Sie holen sich Ihr Repository einmal von GitLab auf den Computer. Danach arbeiten Sie nur noch in diesem Ordner.

  1. 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
  2. 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 ~/schule
    cd ~/schule

    Das Zeichen ~ steht für Ihren persönlichen Benutzerordner (unter Windows C:\Users\IhrName).

  3. 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.git

    Git meldet so etwas wie:

    Cloning into 'muster-max'...
    remote: Enumerating objects: 3, done.
    Receiving objects: 100% (3/3), done.
  4. 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-max
    code .

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.

  1. Klicken Sie in GitLab links oben auf Ihr Profilbild → Edit profile → Personal access tokens → Add new token.

  2. Geben Sie einen Namen ein, zum Beispiel laptop-schule, und wählen Sie ein Ablaufdatum (zum Beispiel das Ende des Schuljahres).

  3. Setzen Sie die Häkchen bei read_repository und write_repository und klicken Sie auf Create token.

  4. Kopieren Sie den Token sofort und bewahren Sie ihn sicher auf. GitLab zeigt ihn nur dieses eine Mal an.

  5. Fragt Git nach Username, geben Sie Ihren GitLab-Benutzernamen ein. Fragt es nach Password, fügen Sie den Token ein (nicht Ihr GitLab-Passwort). Beim Einfügen sehen Sie keine Zeichen; das ist normal.

Angenommen, die erste Schulübung heißt „Einführung“. Sie legen dafür im Repository einen Ordner an:

Terminal-Fenster
mkdir s01-einfuehrung

In VS Code erstellen Sie in diesem Ordner die Datei main.py:

s01-einfuehrung/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.

Ein Commit ist ein Speicherstand. Er entsteht in zwei Schritten, so wie ein Paket:

  1. git add: Sie legen die Dateien in den Karton.
  2. git commit: Sie kleben den Karton zu und schreiben drauf, was drin ist.

Bevor Sie etwas speichern, fragen Sie Git, was neu ist:

Terminal-Fenster
git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
s01-einfuehrung/
nothing added to commit but untracked files present

Git sagt: Es gibt einen neuen Ordner s01-einfuehrung/, den ich noch nicht kenne (untracked).

Terminal-Fenster
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 main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: s01-einfuehrung/main.py
Terminal-Fenster
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.py

Geschafft, das war Ihr erster Speicherstand! Alle bisherigen Commits sehen Sie mit:

Terminal-Fenster
git log --oneline
3f2a1c9 (HEAD -> main) s01: Hallo-Welt-Programm geschrieben
a81b0d4 Initial commit
Gute Commit-NachrichtSchlechte Commit-Nachricht
s02: Aufgabe 1 und 2 gelöstasdf
h01: Begrüßung mit Namen eingebautupdate
h02: Fehler bei leerer Eingabe behobenjetzt gehts

Ihr Commit liegt bis jetzt nur auf Ihrem Computer. Damit er auch in GitLab ankommt, laden Sie ihn hoch:

Terminal-Fenster
git push
Enumerating 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 -> main

Laden Sie Ihr Repository in GitLab im Browser neu: Der Ordner s01-einfuehrung ist jetzt auch dort zu sehen.

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:

Terminal-Fenster
git pull
Updating 3f2a1c9..7c4e2b1
Fast-forward
s02-datentypen/main.py | 12 ++++++++++++
1 file changed, 12 insertions(+)

Ist nichts Neues da, meldet Git Already up to date.

So sieht eine ganze Stunde mit Schulübung 3 aus, von Anfang bis Ende:

Terminal-Fenster
cd ~/schule/muster-max
git pull # 1. Neues holen
mkdir s03-verzweigungen # 2. Ordner anlegen und programmieren ...
git add . # 3. einpacken
git commit -m "s03: Aufgabe 1 gelöst" # 4. speichern
git push # 5. hochladen

Die Teile nach # sind Kommentare; die müssen Sie nicht mittippen.

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.

  1. Alles committen. Prüfen Sie mit git status, dass nichts mehr offen ist. Sonst erst git add . und git commit.

    Terminal-Fenster
    git add .
    git commit -m "h02: Hausübung fertig"
  2. Commits hochladen.

    Terminal-Fenster
    git push
  3. Tag setzen.

    Terminal-Fenster
    git tag h02_ready

    Das Tag klebt jetzt am letzten Commit, aber nur auf Ihrem Computer.

  4. Tag hochladen. Dieser Schritt wird am häufigsten vergessen! Ein normales git push lädt Tags nicht mit hoch:

    Terminal-Fenster
    git push origin h02_ready
    To https://gitlab.com/htl-sew/3ahit/muster-max.git
    * [new tag] h02_ready -> h02_ready
  5. Kontrollieren. Öffnen Sie Ihr Repository in GitLab und klicken Sie links auf Code → Tags. Dort muss h02_ready stehen.

Ihre Tags auf dem Computer zeigt git tag an:

Terminal-Fenster
git tag
h01_ready
h02_ready

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.

Terminal-Fenster
# Stufe "Wesentlich überwiegend" fertig
git add .
git commit -m "h02: Wesentlich überwiegend fertig"
git push
git tag h02_g_ready
git push origin h02_g_ready
# später: Stufe "Wesentlich vollständig" fertig
git add .
git commit -m "h02: Wesentlich vollständig fertig"
git push
git tag h02_e_ready # neues Tag, h02_g_ready bleibt
git push origin h02_e_ready

In GitLab unter Code → Tags stehen danach beide Tags, jedes an seinem eigenen Commit.

Sie haben h02_ready schon hochgeladen und bemerken noch einen Fehler? Dann löschen Sie das Tag, bessern nach und setzen es neu:

Terminal-Fenster
git tag -d h02_ready # 1. Tag auf dem Computer löschen
git 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 setzen
git push origin h02_ready # 5. Tag hochladen

Bei 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.

Was will ich?Befehl
Repository einmal herunterladengit clone https://gitlab.com/…/muster-max.git
Neues von GitLab holengit pull
Nachsehen, was sich geändert hatgit status
Alle Änderungen einpackengit add .
Speicherstand anlegengit commit -m "s01: was ich gemacht habe"
Hochladengit push
Bisherige Commits ansehengit log --oneline
Hausübung als fertig markierengit tag h02_ready
Stufe einer Aufgabe als fertig markierengit tag h02_g_ready (Stufen: g, e, pp, m)
Tag hochladengit push origin h02_ready
Tag löschen (Computer und GitLab)git tag -d h02_ready und git push origin --delete h02_ready

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.

  1. Schlüssel erzeugen. Öffnen Sie ein Terminal (unter Windows Git Bash) und tippen Sie, mit Ihrer eigenen Mail-Adresse:

    Terminal-Fenster
    ssh-keygen -t ed25519 -C "[email protected]"

    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:
  2. Ö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.pub
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHk3...Rk8 [email protected]

    Markieren und kopieren Sie die ganze Zeile.

  3. 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-zuhause ein und klicken Sie auf Add key.

  4. Testen.

    Terminal-Fenster

    Beim ersten Mal fragt das Terminal, ob Sie gitlab.com vertrauen. Tippen Sie yes und Enter. Danach sollte erscheinen:

    Welcome to GitLab, @muster-max!

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:

Terminal-Fenster
cd ~/schule/muster-max
git remote set-url origin [email protected]:htl-sew/3ahit/muster-max.git

Kontrolle:

Terminal-Fenster
git remote -v
origin [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:

Terminal-Fenster
git clone [email protected]:htl-sew/3ahit/muster-max.git

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.