Skip to content

Kapitel 3: Grundlagen lokaler Repositories

3.1 Lokales Repository erstellen (Zwei Methoden)

🔹 Methode 1: git init (Neues Repository initialisieren)

Verwenden Sie git init, um ein neues, leeres Repository zu erstellen.

bash
# 1. Neuen Projektordner erstellen
mkdir mein-projekt
cd mein-projekt

# 2. Git-Repository initialisieren
git init

# Erwartete Ausgabe:
# Initialized empty Git repository in .../mein-projekt/.git/

Was passiert?

  • ✅ Git erstellt einen versteckten .git-Ordner
  • ✅ Dieser Ordner enthält alle Versionsinformationen

Überprüfen:

bash
# .git-Ordner anzeigen (Windows)
dir /a

# .git-Ordner anzeigen (Mac/Linux)
ls -la

🔹 Methode 2: git clone (Bestehendes Repository klonen)

Verwenden Sie git clone, um ein bereits existierendes Repository herunterzuladen.

bash
# Repository von GitHub klonen
git clone https://github.com/benutzer/projekt.git

# Erwartete Ausgabe:
# Cloning into 'projekt'...
# remote: Enumerating objects: 100, done.
# Receiving objects: 100% ...

Was passiert?

  • ✅ Das gesamte Repository wird heruntergeladen
  • ✅ Alle Dateien und die vollständige Historie werden kopiert

Mit Benutzername und Token (GitHub):

bash
# Falls Authentication erforderlich
git clone https://benutzername:token@github.com/benutzer/projekt.git

📊 Vergleich: git init vs. git clone

Aspektgit initgit clone
VerwendungNeues Projekt startenAn bestehendem Projekt teilnehmen
InhaltLeeres RepositoryVollständiges Repository mit Historie
RemoteKein Remote (muss manuell hinzugefügt werden)Remote ist automatisch konfiguriert
AnwendungEinzelentwicklung, neue IdeenTeamarbeit, Open-Source-Beiträge

3.2 Working Directory, Staging Area, Repository (Kernkonzepte)

Git hat drei Zustände, in denen sich Ihre Dateien befinden können:

📖 Drei-Bereiche-Erklärung

┌─────────────────┐
│   Working Dir    │  ← Ihre aktuellen Dateien (Bearbeitung)
│   (Arbeits-      │
│    verzeichnis)  │
└────────┬────────┘
         │ git add

┌─────────────────┐
│  Staging Area   │  ← Vorbereitete Änderungen (für Commit)
│  (Index/        │
│   Zwischen-     │
│   speicher)     │
└────────┬────────┘
         │ git commit

┌─────────────────┐
│   Repository    │  ← Permanent gespeicherte Versionen
│  (Lokales       │
│   Repository)   │
└─────────────────┘

🔹 1. Working Directory (Arbeitsverzeichnis)

  • Was ist das? Die Dateien, an denen Sie gerade arbeiten
  • Status prüfen: git status
  • Farbmarkierung:
    • 🔴 Rot: Nicht getrackte Dateien (untracked)
    • 🔵 Blau: Geänderte Dateien (modified)

Beispiel:

bash
# Datei erstellen
echo "Hallo Welt" > index.html

# Status prüfen
git status

# Ausgabe:
# On branch main
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#         index.html

🔹 2. Staging Area (Index / Zwischenspeicher)

  • Was ist das? Ein "Zwischenlager" für Änderungen, die Sie als nächstes committen wollen
  • Hinzufügen: git add <datei>
  • Entfernen: git restore --staged <datei>

Beispiel:

bash
# Datei zur Staging Area hinzufügen
git add index.html

# Status prüfen
git status

# Ausgabe:
# On branch main
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#         new file:   index.html

Alle Dateien hinzufügen:

bash
# Alle Dateien hinzufügen
git add .

# oder
git add -A

🔹 3. Repository (Lokales Repository)

  • Was ist das? Der .git-Ordner, in dem alle committeten Versionen gespeichert sind
  • Committen: git commit -m "Nachricht"
  • Historie anzeigen: git log

Beispiel:

bash
# Committen
git commit -m "Initialer Commit"

# Ausgabe:
# [main (root-commit) a1b2c3d] Initialer Commit
#  1 file changed, 1 insertion(+)
#  create mode 100644 index.html

📊 Zustandsübergänge (State Transitions)

VonNachBefehl
Working DirectoryStaging Areagit add <datei>
Staging AreaRepositorygit commit -m "Nachricht"
RepositoryWorking Directorygit checkout <commit> (Vorsicht!)
Staging AreaWorking Directorygit restore --staged <datei>

3.3 Kern-Grundbefehle (Praxis)

🔹 1. git add (Dateien zur Staging Area hinzufügen)

bash
# Einzelne Datei hinzufügen
git add index.html

# Mehrere Dateien hinzufügen
git add index.html style.css script.js

# Alle Dateien im aktuellen Verzeichnis hinzufügen
git add .

# Alle Dateien im gesamten Projekt hinzufügen
git add -A

# Nur aktualisierte Dateien hinzufügen (keine neuen Dateien)
git add -u

Tipp: Verwenden Sie git add . für kleine Projekte, aber git add -A für größere Projekte.


🔹 2. git commit (Änderungen ins Repository speichern)

bash
# Standard-Commit
git commit -m "Feature: Login-Seite hinzugefügt"

# Änderungen direkt committen (ohne git add)
git commit -am "Bugfix: Fehler in Login behoben"

# ⚠️ Achtung: Funktioniert nur für bereits getrackte Dateien!

Commit-Nachrichten-Regeln (Best Practices):

  • Kurz und prägnant: Maximale 50 Zeichen für die erste Zeile
  • Präsens verwenden: "Fügt Feature hinzu" statt "Feature hinzugefügt"
  • Präfix verwenden: Feature:, Fix:, Docs:, Refactor:

Beispiel:

bash
git commit -m "Feature: Benutzerprofil-Seite erstellt"
git commit -m "Fix: Login-Fehler behoben"
git commit -m "Docs: README aktualisiert"

🔹 3. git status (Aktuellen Status anzeigen)

bash
# Status anzeigen
git status

# Kurze Statusanzeige
git status -s

# Ausgabe-Beispiel (kurz):
# A  index.html    ← Hinzugefügt (Added)
# M  style.css     ← Geändert (Modified)
# ?? script.js     ← Nicht getrackt (Untracked)

Status-Symbole:

SymbolBedeutung
??Nicht getrackte Datei (untracked)
ANeue Datei (added to staging)
MGeänderte Datei (modified)
DGelöschte Datei (deleted)
RUmbenannte Datei (renamed)

🔹 4. git log (Commit-Historie anzeigen)

bash
# Vollständige Historie anzeigen
git log

# Kurze Historie (eine Zeile pro Commit)
git log --oneline

# Die letzten 5 Commits anzeigen
git log -5

# Historie mit Grafik (Branches anzeigen)
git log --graph --oneline --all

# Autor filtern
git log --author="Max Mustermann"

# Suche nach Schlüsselwort in Commit-Nachricht
git log --grep="Fix"

Ausgabe-Beispiel:

bash
commit a1b2c3d4e5f6789... (HEAD -> main)
Author: Max Mustermann <max@example.com>
Date:   Mon May 26 14:30:00 2024 +0200

    Feature: Login-Seite hinzugefügt

Navigation im Log:

  • Enter: Weiterblättern
  • q: Beenden

3.4 Versionsrückgängigmachen (git reset)

📖 Was ist git reset?

git reset verschiebt den HEAD (aktueller Zweig) auf einen früheren Commit.

🔹 Drei Modi von git reset

ModusBefehlWorking DirStaging AreaRepository
Softgit reset --soft <commit>Bleibt unverändertBleibt unverändertWird zurückgesetzt
Mixed (Standard)git reset --mixed <commit>Bleibt unverändertWird zurückgesetztWird zurückgesetzt
Hardgit reset --hard <commit>Wird zurückgesetztWird zurückgesetztWird zurückgesetzt

🔹 1. git reset --soft (Sicherster Modus)

Setzt das Repository zurück, lässt aber Ihre Änderungen in der Staging Area.

bash
# Letzten Commit rückgängig machen (Änderungen bleiben in staging)
git reset --soft HEAD~1

# Zum Commit vor 3 Commits zurückkehren
git reset --soft HEAD~3

Anwendung: Wenn Sie den letzten Commit ändern möchten (z.B. Commit-Nachricht korrigieren).


🔹 2. git reset --mixed (Standard)

Setzt Repository und Staging Area zurück, lässt aber die Änderungen im Working Directory.

bash
# Standard (--mixed ist Standard)
git reset HEAD~1

# oder explizit
git reset --mixed HEAD~1

Anwendung: Wenn Sie Änderungen rückgängig machen, aber die Dateien behalten möchten.


🔹 3. git reset --hard (⚠️ Gefährlich!)

Setzt alles zurück – alle Änderungen gehen verloren!

bash
# ⚠️ Achtung: Alle Änderungen gehen verloren!
git reset --hard HEAD~1

# Zum ältesten Commit zurückkehren
git reset --hard a1b2c3d

Anwendung: Nur wenn Sie wirklich alles verwerfen möchten.

Tipp: Erstellen Sie vor git reset --hard immer ein Backup!


🆘 Rettung nach git reset --hard

Wenn Sie einen Hard Reset bereuen, können Sie Ihre Commits wiederherstellen:

bash
# Reflog anzeigen (zeigt alle Bewegungen von HEAD)
git reflog

# Ausgabe-Beispiel:
# a1b2c3d HEAD@{0}: reset --hard HEAD~1
# e4f5g6h HEAD@{1}: commit: Feature hinzugefügt

# Commit wiederherstellen
git reset --hard e4f5g6h

3.5 Dateien ignorieren (.gitignore konfigurieren)

📖 Warum .gitignore?

Manche Dateien sollten nicht in Git gespeichert werden:

  • Log-Dateien (*.log)
  • Temporäre Dateien (*.tmp, *.cache)
  • Build-Artefakte (dist/, build/)
  • Abhängigkeiten (node_modules/)
  • Umgebungsvariablen (.env)

🔹 .gitignore erstellen und konfigurieren

bash
# .gitignore-Datei erstellen
touch .gitignore  # Mac/Linux
echo. > .gitignore  # Windows

Beispiel-Inhalt von .gitignore:

gitignore
# Abhängigkeiten
node_modules/
vendor/

# Build-Artefakte
dist/
build/
*.log

# Umgebungsvariablen
.env
.env.local

# IDE-Dateien
.vscode/
.idea/
*.swp

# Betriebssystem-Dateien
.DS_Store  # Mac
Thumbs.db  # Windows

🔹 .gitignore Muster (Patterns)

MusterBedeutungBeispiel
*.logAlle Dateien mit Endung .logapp.log, error.log
dist/Den Ordner dist und seinen Inhaltdist/index.html
/tmpNur den Ordner tmp im Root-Verzeichnistmp/, aber nicht src/tmp/
!wichtig.logAusnahme (nicht ignorieren)wichtig.log wird getrackt
**/logsAlle Ordner namens logs rekursivlogs/, src/logs/

🔹 Bereits getrackte Dateien ignorieren

Wenn eine Datei bereits in Git ist, wird .gitignore sie nicht ignorieren.

Lösung: Datei aus dem Index entfernen (aber lokal behalten):

bash
# Datei aus dem Repository entfernen, aber lokal behalten
git rm --cached .env

# Dann committen
git commit -m "Chore: .env zur .gitignore hinzugefügt"

3.6 Lokales Repository Praxisbeispiel (Hands-on)

📝 Szenario: Neues Projekt erstellen und versionieren

Schritt 1: Projekt initialisieren

bash
# Neuen Ordner erstellen
mkdir mein-blog
cd mein-blog

# Git-Repository initialisieren
git init

Schritt 2: Dateien erstellen

bash
# README.md erstellen
echo "# Mein Blog" > README.md

# index.html erstellen
echo "<h1>Willkommen zu meinem Blog</h1>" > index.html

Schritt 3: Status prüfen

bash
git status

# Ausgabe:
# On branch main
# No commits yet
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#         README.md
#         index.html

Schritt 4: Dateien zur Staging Area hinzufügen

bash
git add .

git status

# Ausgabe:
# Changes to be committed:
#   (use "git restore --staged <file>..." to unstage)
#         new file:   README.md
#         new file:   index.html

Schritt 5: Committen

bash
git commit -m "Initialer Commit: Blog-Projekt gestartet"

# Ausgabe:
# [main (root-commit) a1b2c3d] Initialer Commit: Blog-Projekt gestartet
#  2 files changed, 2 insertions(+)

Schritt 6: Änderungen vornehmen

bash
# index.html ändern
echo "<p>Dies ist ein Paragraph.</p>" >> index.html

# Status prüfen
git status

# Ausgabe:
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#         modified:   index.html

Schritt 7: Änderungen committen

bash
git add index.html
git commit -m "Feature: Paragraph zur index.html hinzugefügt"

Schritt 8: Historie anzeigen

bash
git log --oneline

# Ausgabe:
# e4f5g6h Feature: Paragraph zur index.html hinzugefügt
# a1b2c3d Initialer Commit: Blog-Projekt gestartet

📝 Zusammenfassung

In diesem Kapitel haben Sie gelernt:

  • Lokales Repository erstellen (git init, git clone)
  • Drei Bereiche verstehen (Working Directory, Staging Area, Repository)
  • Kern-Grundbefehle (git add, git commit, git status, git log)
  • Versionen rückgängig machen (git reset --soft/mixed/hard)
  • Dateien ignorieren (.gitignore konfigurieren)
  • Praxisbeispiel (Projekt initialisieren, ändern, committen)

Nächstes Kapitel: Wir werden Git-Befehle vertiefen (git log erweitert, Änderungen rückgängig machen, git diff).



Copyright © 2024 Git-Tutorial für Anfänger

Frei für alle Anfänger