Gitlab
Wird von der Arbeit zur Verfügung gestellt - aber funktioniert prinzipiell wie Github. In meinem Konto kann ich private (also, für dritte nicht sichtbare) als auch öffentliche Projekte speichern.
Bevor man irgendwas startet
Git muss installiert sein. Auf einem Linux System geht das per apt-get install git
Man sollte einen Account haben und sich einloggen können. Ggf. sollte man auch einen SSH Key hinterlegt haben - geht aber auch erst mal ohne…
Kurz die wesentlichen Begriffe
Da man damit nun nicht ständig rumhantiert und ohne Erläuterung das Ganze nicht wirklich nachvollziehbar ist.
- repository -> Ein Verzeichnis das alle Dateien, Unterverzeichnisse und die Versionshistorie eines Projektes beinhaltet.
- .git -> Erzeugt man ein repository wird auf dem Rechner automatisch ein verstecktes Verzeichnis mti der bezeichnung
.git
erstellt. Dort werden alle wesentlichen Daten zum Repo gespeichert! - clone a repo -> Um mit Code zu arbeiten, clont man ein bestehendes Git Repo von einem Server lokal auf den Rechner. In dieser lokalen Kopie arbeitet man dann. Änderungen werden wieder zum Server per
push
Befehl gesendet. - branches -> wenn mehrere an einem Projekt arbeiten, hat jeder seine
branch
. Damit kommt man sich nicht in die Quere. - main branch ->
main
oder auchmaster
(veraltert) ist die Bezeichnung der Standard branch. - merge -> Hat man z.B. Fehler beseitigt oder einen Teil weiter entwickelt, kann per
merge
der Code der eigenenbranch
inmain
(standard) verschoben werden.merge
kombiniert quasi eine branch mit einer anderen. - conflicts -> kommt es im Code zu Konflikten im
merge
Prozess, müssen sie manuell gelöst werden.
War der merge
erfolgreich, kann die branch
gelöscht werden, um unnötige Daten zu vermeiden.
Der Git Workflow
Clonen
eines Repos auf den lokalen Rechner- Erzeugen einer neuen
branch
(Zweig) für die eigenen Änderungen im Code - Änderungen an der eigenen lokalen Kopie machen
Staging
- also Bereitstellen der Änderungen, die man übertragen (commit
) möchte.Commiting
- also übertragen der Änderungen in das lokalen RepositoryPushing
- also hochladen der Änderungen zum Git ServerMerging
- also zusammenführen der eigenenbranch
mit der Standardbranch
namensmain
.
Fork
ist eine persönliche Kopie des kompletten repositories (also mit allen branches), das man in einem selbstgewählten “Namensraum” speichert. Dann kann man im eigenen fork
arbeiten bevor an es in die Standardbranch merged
.
Gängigsten Kommandos
git clone
: Ein Repo vom Server auf den lokalen Rechner holengit branch
: auflisten, erzeugen oder löschen vonbranches
git checkout
: Zwischen verschiedenenbranches
wechselngit add
: Änderungen für die Übertragung festlegengit commit
: Übertragen der vorher festgelegten Änderungen in das “lokale” Repositorygit push
: Hochladen der “lokalen” Änderungen zum Server Repositorygit pull
: Holen von Änderungen vom Server Repository und zusammenführen in den lokalen Zweig
Auf Gitlab gibt es die Dokumentation und dort ein kleines Tutorial wo die grundlegenden Kommandos geübt werden können.
Schritt 1 Auf Gitlab einloggen und dort ein neues leeres Projekt erstellen (Django 5 boilerplate). Dann den Button “clone” anklikcen. Dort sind zwei Links - eins für ssh und iens für eine https Verbindung. Einen in die Zwischenablage kopieren und dann auf dem Zielrechner in das Verzeichnis wechseln, wohin die geclont werden soll:
dorian@moon:~/PycharmProjects$ mkdir testgit
dorian@moon:~/PycharmProjects$ cd testgit
dorian@moon:~/PycharmProjects/testgit$ git clone https://gitlab.ruhr-uni-bochum.de/nikolnb9/django-5-boilerplate.git
Klone nach 'django-5-boilerplate'...
Username for 'https://gitlab.ruhr-uni-bochum.de': nikolnb9
Password for 'https://nikolnb9@gitlab.ruhr-uni-bochum.de':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Empfange Objekte: 100% (3/3), fertig.
dorian@moon:~/PycharmProjects/testgit$
Wichtig: erstellt man erst ein Projektverzeichnis und clont dorthin das Git Repo, wird es als Verzeichnis erstellt. Also hat man eine Extra-Verzeichnisebene. Ist die Frage ob das immer so gewünscht ist. Hier zum Beispiel:
—PycharmProjects/ | —testgit/ | —django-5-boilerplate/
Prüfen welche branch
das ist:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git branch
* main
Eine eigene branch
für das lokale Repo erstellen:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git checkout -b my-personal-django5-branch
Zu neuem Branch 'my-personal-django5-branch' gewechselt
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$
Nun zeigt das vorletzte Kommando zwei Branches:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git branch
main
* my-personal-django5-branch
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$
Nun mit einem Editor die README.md Datei öffnen und unten einfach Text ergänzen. Nach dem Speichern status prüfen:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ nano README.md
...
hallo ich nutze jetzt git!
...
Status erneut prüfen - es werden nun nämlich Änderungen angezeigt:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git status
Auf Branch my-personal-django5-branch
Änderungen, die nicht zum Commit vorgemerkt sind:
(benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
(benutzen Sie "git restore <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)
geändert: README.md
keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$
Es steht auch direkt was getan werden muss - nämlich die Änderungen hinzugefügt werden. Man kann jetzt einfach “alles” vermerken oder einfach nur die einzelne Datei (README.md)
git add --all # fügt alles hinzu
git add README.md # spezifische Datei
ich habe einfach mal das erste Kommando genommen, was bei vielen Änderungen praktikabel ist. Man kann sich gleich den Status wieder ausgeben lassen, da nach dem git add --all
nichts im Terminal passiert.
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git add --all
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git status
Auf Branch my-personal-django5-branch
Zum Commit vorgemerkte Änderungen:
(benutzen Sie "git restore --staged <Datei>..." zum Entfernen aus der Staging-Area)
geändert: README.md
Nun kann die Änderung zunächst im lokalen Repo übertragen werden. Eine Nachricht zur Änderung kann mit übergeben werden. Diese Nachricht muss in Anführungszeichen stehen:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git commit -m "Text in der README ergänzt"
[my-personal-django5-branch 0d2c0fc] Text in der README ergänzt
Committer: dorian <dorian@debian-BULLSEYE-live-builder-AMD64>
Ihr Name und E-Mail Adresse wurden automatisch auf Basis
Ihres Benutzer- und Rechnernamens konfiguriert. Bitte prüfen Sie, dass
diese zutreffend sind. Sie können diese Meldung unterdrücken, indem Sie
diese explizit setzen. Führen Sie dazu den folgenden Befehl aus und folgen
Sie den Anweisungen in Ihrem Editor, um die Konfigurationsdatei zu bearbeiten:
git config --global --edit
Nachdem Sie das getan haben, können Sie Ihre Identität für diesen Commit
ändern mit:
git commit --amend --reset-author
1 file changed, 3 insertions(+)
Die obige Änderung ist jetzt in der eigenen Branch (“my personal django5 branch”) bekannt, diese aber erst mal nur auf dem eigenen Rechner. Damit alle es sehen muss es auf Gitlab bekannt gemacht werden (per push aber eben auch auf die eigene Branch!):
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git push origin my-personal-django5-branch
Username for 'https://gitlab.ruhr-uni-bochum.de': nikolnb9
Password for 'https://nikolnb9@gitlab.ruhr-uni-bochum.de':
Objekte aufzählen: 5, fertig.
Zähle Objekte: 100% (5/5), fertig.
Delta-Kompression verwendet bis zu 4 Threads.
Komprimiere Objekte: 100% (2/2), fertig.
Schreibe Objekte: 100% (3/3), 340 Bytes | 340.00 KiB/s, fertig.
Gesamt 3 (Delta 1), Wiederverwendet 0 (Delta 0), Pack wiederverwendet 0
remote:
remote: To create a merge request for my-personal-django5-branch, visit:
remote: https://gitlab.ruhr-uni-bochum.de/nikolnb9/django-5-boilerplate/-/merge_requests/new?merge_request%5Bsource_branch%5D=my-personal-django5-branch
remote:
To https://gitlab.ruhr-uni-bochum.de/nikolnb9/django-5-boilerplate.git
* [new branch] my-personal-django5-branch -> my-personal-django5-branch
Nun ist die eigene branch
auch auf dem Server bekannt und sichtbar für alle im Projekt. Klickt man dort auf Projekt bei den Branches ist neben “main” nun auch “my-erpsnal-django5-branch” aufgelistet!
Die Zweige vereinen
Nun könnten die Änderungen aus der eigenen my-personal-django5-branch mit der main branch vereint werden (merge branches). Das wird alles im lokalen Arbeitsverzeichnis gemacht (3 Git Kommandos). Einfachheitshalber wurde hier direkt mit der Default Branch gemerged. In Gitlab nutzt man aber normalerweise einen merge request
…
git checkout main # man wechselt damit in die main branch
git merge my-personal-django5-branch
git push
Im Browser kann man nun in die eigene Branch wechseln und sieht nur dort die geänderte Readme Datei. Erst wenn die eigene Branch mit der Default Branch gemerged wurde, fließt es unter main
sichtbar.
Also führe ich mal die obigen drei Kommandos im Terminal auf dem Rechner (im lokalen repo) aus:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git checkout main
Zu Branch 'main' gewechselt
Ihr Branch ist auf demselben Stand wie 'origin/main'.
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git merge my-personal-django5-branch
Aktualisiere 992c25f..0d2c0fc
Fast-forward
README.md | 3 +++
1 file changed, 3 insertions(+)
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git push
Username for 'https://gitlab.ruhr-uni-bochum.de': nikolnb9
Password for 'https://nikolnb9@gitlab.ruhr-uni-bochum.de':
Gesamt 0 (Delta 0), Wiederverwendet 0 (Delta 0), Pack wiederverwendet 0
To https://gitlab.ruhr-uni-bochum.de/nikolnb9/django-5-boilerplate.git
992c25f..0d2c0fc main -> main
Schaut man sich jetzt die README Datei in “main” an, ist dort nun auch die überarbeitete Version hinterlegt. Jetzt sollte man noch auf dem Rechner im Terminal zur eigenen Branch wieder zurück wechseln:
dorian@moon:~/PycharmProjects/testgit/django-5-boilerplate$ git checkout my-personal-django5-branch
Zu Branch 'my-personal-django5-branch' gewechselt
Man kann nun weitere Änderungen machen… Sollte man sich mal irgendwo verhaspeln kann alles wieder schrittweise zurück gesetzt werden. Im Zweifelsfall kann auch einfach eine neue Branch erstellt werden und man startet wieder…
Cheat Sheet
für die gängigsten Befehle gibt es ein cheat sheet