Git für Einsteiger

Zuletzt aktualisiert am 10. Februar 2024 von Lars

Was ist Git?

Git ist ein Versionskontrollsystem, das von Entwicklern verwendet wird, um den Quellcode von Softwareprojekten zu verwalten. Es ermöglicht mehreren Personen, an demselben Projekt zu arbeiten, ohne sich gegenseitig zu stören.

Git ist eine Sammlung von Tools für die Kommandozeile, mit denen Änderungen in Dateien überwacht und verfolgt werden. Obwohl es oft für Quellcode benutzt wird, kannst du damit eigentlich alle möglichen Dateien im Blick behalten, egal ob Texte oder sogar Bilder.

Dank Git kannst du ältere Versionen deines Projekts wieder zum Leben erwecken, sie unter die Lupe nehmen, vergleichen, zusammenführen und noch viel mehr.

Das Besondere an Git ist, dass es dezentralisiert ist. Das heisst, es braucht keinen grossen, zentralen Server, um deine alten Dateiversionen zu speichern. Es macht alles direkt bei dir lokal und speichert die Informationen in einem Ordner auf deiner Festplatte, der Repository genannt wird.

In diesem Artikel verwende ich meine eigene Adresse. Du musst diese bei dir entsprechend anpassen. Also statt zum Beispiel "git@github.com:LarsSchl/first-test-rep.git" muss du die Adresse deines Remote Repositorys verwenden.

So installierst du Git

Um loszulegen, muss die Software erst einmal auf deinem Rechner installiert werden. Git ist für alle gängigen Betriebssysteme verfügbar:

Windows

Verwende hierfür Git für Windows. Git für Windows bringt sogar eine grafische Oberfläche mit.

Linux

Installiere Git über deinen Paketmanager. Unter Ubuntu zum Beispiel mit sudo apt-get install git.

Mac OS X

Hier empfiehlt es sich, zunächst den macOS Paketmanager homebrew zu installieren und dann git selber mit brew install git zu installieren.

Git konfigurieren

Im folgenden geht es hier unter Linux weiter.

Git wird über die Kommandozeile gesteuert. Bevor wir mit der eigentlichen Arbeit loslegen, müssen wir ein paar Dinge konfigurieren.

Benutzername und E-Mail konfigurieren

git config --global user.name "Lars"
git config --global user.email lars@mail.com

Jede Aktion, die jetzt via Git auf Dateien gemacht wird, wird mit dem Namen und der E-Mail-Adresse geloggt.

Konfiguration anzeigen

Mit diesem Befehl kannst du deine Konfiguration anzeigen.

git config --list

Du siehst die globale Konfiguration ausserdem in der Datei ~/.gitconfig . Die lokale in der Datei .git/config .

Git Repository erstellen

Ein Git-Repository ist ein Speicherort, in dem du alle Dateien und Informationen für ein bestimmtes Projekt oder eine Softwareanwendung verwaltest. Es ermöglicht dir, Änderungen zu verfolgen, verschiedene Versionen zu speichern und die Zusammenarbeit mehrerer Personen an einem Projekt zu koordinieren.

So erstelle ich mein erstes Repository.

Ich habe mir in einem Unterordner auf meinem Laufwerk einen Ordner angelegt, in dem eine Beispiel-HTML- und eine Beispiel-CSS-Datei abgelegt ist.

Um daraus nun ein Repository zu machen, muss ich von der Kommandozeile in den richtigen Ordner wechseln und git init aufrufen.

lars@lars-Surface-Go-2:~$ cd git-lernen/
lars@lars-Surface-Go-2:~/git-lernen$ git init
Hinweis: Als Name für den initialen Branch wurde 'master' benutzt. Dieser
Hinweis: Standard-Branchname kann sich ändern. Um den Namen des initialen Branches
Hinweis: zu konfigurieren, der in allen neuen Repositories verwendet werden soll und
Hinweis: um diese Warnung zu unterdrücken, führen Sie aus:
Hinweis:
Hinweis: git config --global init.defaultBranch
Hinweis:
Hinweis: Häufig gewählte Namen statt 'master' sind 'main', 'trunk' und
Hinweis: 'development'. Der gerade erstellte Branch kann mit diesem Befehl
Hinweis: umbenannt werden:
Hinweis:
Hinweis: git branch -m
Leeres Git-Repository in /home/lars/git-lernen/.git/ initialisiert

Dateien dem Git-Repository hinzufügen

Mit folgendem Befehl kannst du alle Dateien im Ordner dem Repository hinzufügen

git add -A

Einzelne Dateien kannst du zum Beispiel mit

git add <dateiname> 

hinzufügen.

Status des Repositorys überprüfen

Mit

git status 

kann man den Status überprüfen.

Das sieht jetzt bei mir so aus:

lars@lars-Surface-Go-2:~/git-lernen$ git status
Auf Branch master

Noch keine Commits

Zum Commit vorgemerkte Änderungen:
(benutzen Sie "git rm --cached …" zum Entfernen aus der Staging-Area)
neue Datei: index.html
neue Datei: p.css

Unsere Dateien befinden sich im Staging-Bereich. Die Statusmeldung informiert uns zudem über die Veränderungen, die in den Dateien im Staging-Bereich vorgenommen wurden - in diesem Fall wurden zwei neue Dateien hinzugefügt.

Commit erstellen

Ein Commit in Git repräsentiert einen Punkt in der Versionsgeschichte eines Projekts, bei dem Änderungen an Dateien festgehalten und kommentiert werden. Dies ermöglicht eine geordnete Verfolgung der Entwicklung und die Rückkehr zu bestimmten Projektzuständen.

So erstellst du deinen ersten commit.

lars@lars-Surface-Go-2:~/git-lernen$ git commit -m "Commit 1"
[master (Root-Commit) dd6cfc8] Commit 1
2 files changed, 31 insertions(+)
create mode 100644 index.html
create mode 100644 p.css

Den Verlauf der Commits kann man sich so anschauen.

git log

Branches

In GIT sind Branches vergleichbar mit individuellen Entwicklungspfaden innerhalb eines Projekts. Sie ermöglichen es dir, an der Software zu arbeiten, ohne die Hauptversion, den 'main-Branch', zu beeinflussen.

Wenn du an einem neuen Feature oder einer Fehlerbehebung arbeitest, erstellst du einen eigenen Branch. Dieser dient als dein persönlicher Arbeitsbereich, in dem du Änderungen vornehmen kannst, ohne das Hauptprojekt zu stören. Sobald du mit deiner Arbeit zufrieden bist, kannst du deinen Branch mit dem Hauptprojekt zusammenführen, um deine Änderungen in das Gesamtprojekt einfliessen zu lassen. So ermöglicht GIT eine flexible und gleichzeitig strukturierte Entwicklung, bei der viele Personen gleichzeitig an verschiedenen Aspekten eines Projekts arbeiten können.

Branch erstellen

git branch function01

In den Branche wechseln

git checkout function1

Branches zusammenführen

Du arbeitest jetzt an deinem Branche. Beispielsweise fügst du die Seite site.html hinzu.

git add site.html
git commit -m "Function is finished"

Zurück in den Hauptzweig wechseln

git checkout 

Eigentliches zusammenführen mit merge:

git merge function1

Remote-Repository auf Github

Was ist Github?

Github kann man sich vereinfacht als soziales Netzwerk für Programmierer und deren Software vorstellen. Man kann dort Programme oder Programmteile veröffentlichen, die andere nutzen können, oder von anderen veröffentlichte Programmteile in der eigenen Software nutzen.

Sehr gut erklärt ist das im Video Was ist GitHub? Einfach erklärt!

Ausgangslage

Aktuell existiert unser Commit ausschliesslich lokal. Git wird aber im Regelfall dazu benutzt, unsere Arbeit mit anderen Entwicklern zu teilen und sie auf einem Server oder einem Repository-Hosting-Dienst wie Github bereitzustellen.

Um die nächsten Schritte mitzumachen, kannst du dir ein kostenloses Konto bei GitHub erstellen und dort ein Repository erstellen.

Änderung auf das Remote-Repository übertragen

Falls dein Repository privat ist, musst du dich erst einmal authentifizieren. Das geht nicht mehr über Benutzername / Passwort, sondern zum Beispiel via SSH.

Ein SSH-Schlüssel ist eine sichere Methode, um auf entfernte Server zuzugreifen, ohne ein Passwort verwenden zu müssen. Bei SSH gibt es zwei wei Schlüssel: einen öffentlichen und einen privaten Schlüssel. Der öffentliche Schlüssel wird auf dem Server gespeichert, zu dem du dich verbinden möchtest, während du den privaten Schlüssel auf deinem eigenen Computer aufbewahrst. Mit diesem Schlüsselpaar kannst du eine verschlüsselte Verbindung herstellen, ohne dein Passwort preiszugeben. SSH-Schlüssel sind sicherer als Passwörter und spielen eine wichtige Rolle in der sicheren Serverkommunikation.

SSH-Schlüssel generieren (Linux)

SSH Key erstellen: Der ultimative Guide (Warum, Einrichtung macOS) 🔑

Das Video wird von YouTube eingebettet und erst beim Klick auf den Play-Button geladen. Es gelten die Datenschutzerklärungen von Google.

Hier die Schritte, um einen SSH-Schlüssel zu generieren:

  • Öffne ein Terminal: Drücke Ctrl + Alt + T, um ein Terminal-Fenster zu öffnen. Du wirst die Befehlszeile verwenden, um den SSH-Schlüssel zu erstellen.
  • Gib den Befehl ein, um einen SSH-Schlüssel zu generieren: Du kannst deinen eigenen Kommentar hinzufügen, um den Schlüssel zu identifizieren. Zum Beispiel: ssh-keygen -t ed25519 -C lars@mail.com Dieser Befehl erstellt einen SSH-Schlüssel vom Typ RSA mit einer Schlüssellänge von 4096 Bit und der E-Mail-Adresse als Kommentar. Verwende hier die E-Mail-Adresse, die du bei der Anmeldung bei Github verwendet hast.
  • Du wirst aufgefordert, den Speicherort für den SSH-Schlüssel anzugeben. Du kannst die Standardeinstellungen verwenden, indem du einfach "Enter" drückst, um den Schlüssel im Standardverzeichnis (~/.ssh) zu speichern.
  • Als Nächstes wirst du aufgefordert, ein Passwort für den SSH-Schlüssel festzulegen. Es ist eine optionale Sicherheitsmassnahme. Wenn du ein Passwort festlegen möchtest, gib es ein und bestätige es. Andernfalls kannst du das Feld leer lassen und einfach "Enter" drücken.
  • Der SSH-Schlüssel wird jetzt generiert. Du solltest eine Ausgabe sehen, die den Pfad zum erstellten Schlüssel anzeigt.
lars@lars-Surface-Go-2:~/.ssh$ ssh-keygen -t ed25519 -C lars@mail.com
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/lars/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/lars/.ssh/id_ed25519
Your public key has been saved in /home/lars/.ssh/id_ed25519.pub
  • Stelle als nächstes sicher, dass der SSH-Agent auch gestartet ist.
eval "$(ssh-agent -s)"
  • Anschliessend müssen wir noch die Konfigurationsdatei von SSH anpassen. Sie befindet sich unter ~/.ssh/config
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519

Damit erlauben wir dem SSH Agent, für den Host github.com den Private Key zu verwenden.

  • Als Nächstes fügst du den gerade erstellen SSH-Key noch dauerhaft dem System hinzu.
lars@lars-Surface-Go-2:~/.ssh$ ssh-add id_ed25519

Das war's! Du hast erfolgreich einen SSH-Schlüssel auf deinem Linux Mint-System erstellt. Du kannst den öffentlichen Schlüssel (normalerweise mit der Dateiendung ".pub") jetzt bei Github ablegen, um dich in Zukunft darauf anmelden zu können. Stelle sicher, dass der private Schlüssel gut geschützt ist, da er Zugriff auf die Remote-Server gewährt.

Public SSH-Key bei Github hinterlegen

Die Einstellungen findest du, wenn du auf dein Pofilicon klickst und auf "Settings".

Hier gibst du einfach den Inhalt der Datei des öffentlichen Schlüssels, also der mit der Endung .pub, ein.

Änderung übertragen

Du brauchst zunächst die richtige URL für dein Remote-Repository. Du benötigst die SSH-Variante und nicht die HTTPS.

Diese findest du, wenn du via Browser auf dein Remote-Repository gehst. Dort auf "Code" klickst, den Reiter "SSH" anwählst und von dort die SSH-Adresse kopierst.

Verbinde dich jetzt von deinem lokalen Rechner aus mit deinem Remote-Repository. Beispiel

lars@lars-Surface-Go-2:~/git-lernen$ git remote add origin git@github.com:LarsSchl/first-test-rep.git

Wichtig: Du musst das Kommando aus dem Verzeichnis deines lokalen git absetzen, da du sonst die Meldung erhältst "fatal: Kein Git-Repository (oder irgendeines der Elternverzeichnisse): .git"

Jetzt kannst du die Änderungen auf den Remote-Server übertragen.

git push origin main

Änderungen vom Remote-Server abrufen

Verwende git pull, wenn du die Änderungen, die auf dem Remote-Server existieren, in deinen lokalen Branch integrieren möchtest, um deine Arbeit zu aktualisieren.

git pull origin main

git pull ist eigentlich eine Kombination aus zwei Git-Befehlen: git fetch gefolgt von git merge. Wenn du git pull origin main ausführst, passieren folgende Schritte:

  1. Git Fetch: Zuerst holt git fetch alle Änderungen vom Remote-Server (in diesem Fall von origin) für den angegebenen Branch (main), aber es ändert nicht deine lokalen Arbeitsdateien oder deinen aktuellen Branch. Es holt die Daten und aktualisiert deine Remote-Tracking-Branches (origin/main).
  2. Git Merge: Anschließend führt git merge einen Merge des Remote-Branches (origin/main) in deinen aktuellen Branch aus. Wenn du auf dem main-Branch bist und git pull origin main ausführst, wird Git versuchen, Änderungen von origin/main in deinen lokalen main-Branch zu integrieren.

Git Merge

git merge wird verwendet, um die Änderungen von einem Branch in einen anderen zu integrieren. Zum Beispiel, wenn du an einem Feature in einem Branch namens feature-branch gearbeitet hast und diese Änderungen in den main-Branch integrieren möchtest, würdest du zuerst zu main wechseln (git checkout main) und dann git merge feature-branch ausführen.

Du würdest git merge verwenden, wenn du bereit bist, die Entwicklungszweige (z.B. Feature-Branches) in deinen Hauptentwicklungszweig (z.B. main) zu integrieren, oder wenn du Änderungen aus einem anderen lokalen Branch in deinen aktuellen Branch einbringen möchtest.

Repository clonen

Um ein Repostiory zu clonen, kann man von lokal diesen Befehl ausführen.

git clone git@github.com:LarsSchl/first-test-rep.git

Commits überprüfen

So gibst du die Liste der Commits aus.

lars@lars-Surface-Go-2:~/git-lernen$ git log
commit 23fea5bf352a024e1f499de33b1cb3fc51d6973f (HEAD -> main)
Author: Lars <lars@schlageter.ch>
Date:   Sun Jan 14 15:55:07 2024 +0100

    function finished

commit 6b70619c798e55cdd3e70dfc519e13a5db5fa732 (function01)
Author: Lars <lars@schlageter.ch>
Date:   Sun Jan 14 15:48:11 2024 +0100

    Function is finished

commit e03f709fcf21090f55f61337b8336e31c61e4b06 (origin/main)
Author: LarsSchl <151775577+LarsSchl@users.noreply.github.com>
Date:   Sun Jan 14 12:24:01 2024 +0100

    Create README.md

commit dd6cfc8bd29f84f1b1e50a2116301db9dae50072
Author: Lars <lars@schlageter.ch>
Date:   Wed Nov 22 18:33:20 2023 +0100

    Commit 1

Für jeden Commit ist eine ID vergeben.

Details zu der ID siehst du mit dem Befehl:

lars@lars-Surface-Go-2:~/git-lernen$ git show e03f709
commit e03f709fcf21090f55f61337b8336e31c61e4b06 (origin/main)
Author: LarsSchl <151775577+LarsSchl@users.noreply.github.com>
Date: Sun Jan 14 12:24:01 2024 +0100
Create README.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..18802c1
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@

Es reicht, wenn du die ersten Stellen der ID angibst, damit Git den richtigen findet.

Eine Datei rückgängig machen

lars@lars-Surface-Go-2:~/git-lernen$ git checkout 6b70619c798e55cd site.html
1 Pfad von 6b46b2f aktualisiert

Einen ganzen Commit rückgängig machen

Den Commit mit der ID <ID> rückgängig machen:

git revert <ID>

Den letzten Commit rückgängig machen

git revert HEAD

Begriffe

  • Add: Mit git add werden neue oder geänderte Dateien zur Staging Area hinzugefügt, um sie für das nächste Commit vorzubereiten​​.
  • Branch: Ein Branch in GIT repräsentiert eine unabhängige Entwicklungslinie innerhalb des Projekts, die es ermöglicht, an unterschiedlichen Features oder Korrekturen parallel zur Hauptlinie zu arbeiten​​.
  • Clone: Der Befehl git clone erstellt eine Kopie eines bestehenden Git-Repositories, typischerweise als erster Schritt, um an einem Projekt mitzuarbeiten​​.
  • Commit: Ein Commit ist eine Aufzeichnung von Änderungen im Repository und bildet eine Momentaufnahme des aktuellen Zustands der Arbeitskopie​​.
  • Fetch: Der Befehl git fetch lädt Informationen von einem entfernten Repository herunter, ohne diese automatisch mit dem lokalen Repository zu verschmelzen​​.
  • Merge: Der Befehl git merge wird verwendet, um Änderungen aus verschiedenen Branches in einen einzigen Branch zu integrieren. Er ist entscheidend für die Zusammenführung von Entwicklungsarbeiten​​.
  • Pull: git pull kombiniert die Befehle fetch und merge. Es holt Änderungen aus einem entfernten Repository und integriert sie in das lokale Repository​​.
  • Push: Mit git push werden lokale Änderungen an ein entferntes Repository gesendet. Dieser Vorgang umfasst das Hochladen von Commits auf einen Server​​.
  • Remote: Der Begriff "remote" bezieht sich auf ein entferntes Repository. Mit Befehlen wie git remote add kann man ein entferntes Repository bekannt machen und mit ihm interagieren​​.
  • Repository (lokal/remote): Ein Repository ist eine Sammlung aller Dateien eines Projekts und deren Versionsgeschichte. Ein lokales Repository befindet sich auf deinem Computer, während ein entferntes Repository auf einem Server liegt​​.
  • Staging Area: Ein Bereich, in dem Änderungen vor einem Commit vorbereitet und überprüft werden​​.
  • Stash: Mit git stash können temporäre Änderungen gespeichert werden, ohne einen Commit durchzuführen, um später darauf zurückzugreifen​​.
  • Working Copy: Bezieht sich auf die lokale Kopie deiner Dateien aus dem Repository, an denen du gerade arbeitest​​.

Troubleshooting

SSH

SSH-Schlüssel verwalten

Hier ein paar Befehle zum Troubleshooting, falls es mit dem SSH-Schlüssel nicht klappt.

SSH-Schlüssel anzeigen

ssh-add -l

SSH-Schlüssel löschen

ssh-add -d

Git

Meldung: "Aktualisierungen wurden zurückgewiesen, weil die Spitze Ihres aktuellen..."

git pull --rebase origin master

Danach sollte...

git push -u origin master

...wieder funktionieren.

Branch löschen

git branch -d <Name des Branch>

Dateien und Verzeichnisse ignorieren

Falls bestimmte Dateien von Git ausgenommen werden sollen, dann kannst du eine Datei namens .gitignore erstellen und darin alle zu ignorierenden Dateien und Verzeichnisse einbinden.

Quellen / Weitere Referenzen

Du willst meine Arbeit unterstützen? Dann freue ich mich über eine kleine Spende!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert