Skip to content

Kapitel 4: Erweiterte Git-Befehle

4.1 Commit-Historie im Detail (git log erweitert)

📖 Einfache git log Optionen

bash
# Eine Zeile pro Commit
git log --oneline

# Die letzten 5 Commits
git log -5

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

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

# Nach Datum filtern
git log --since="2024-01-01" --until="2024-12-31"

# Suche in Commit-Nachrichten
git log --grep="Fix"

🔹 Erweiterte Formatierung

bash
# Benutzerdefiniertes Format
git log --pretty=format:"%h - %an, %ar : %s"

# Ausgabe-Beispiel:
# a1b2c3d - Max Mustermann, vor 2 Tagen : Fix: Login-Fehler behoben

Format-Platzhalter:

PlatzhalterBedeutung
%hKurzer Hash (abgekürzt)
%HVollständiger Hash
%anAutorname
%arRelative Zeit (z.B. "vor 2 Tagen")
%sBetreffzeile (Commit-Nachricht)

🔹 Commits visualisieren (Git Graph)

bash
# Schöne Grafik aller Branches
git log --graph --oneline --decorate --all

# Ausgabe-Beispiel:
# * a1b2c3d (HEAD -> main) Feature: Login hinzugefügt
# | * e4f5g6h (feature-payment) Feature: Zahlung integriert
# |/
# * b7c8d9e Fix: Bug behoben

Tipp: Verwenden Sie ein Tool wie Git Graph (VS Code Extension) für eine noch bessere Visualisierung.


4.2 Änderungen rückgängig machen (Undo Operations)

📖 Verschiedene Rückgängig-Methoden

SzenarioBefehlBereich
Arbeitsbereich-Änderungen verwerfengit restore <datei>Working Directory
Staging-Area-Änderungen verwerfengit restore --staged <datei>Staging Area
Letzten Commit änderngit commit --amendLetzter Commit
Alten Commit rückgängig machengit revert <commit>Beliebiger Commit
Commits löschengit reset --hard <commit>Repository (⚠️ Gefährlich)

🔹 1. Arbeitsbereich-Änderungen rückgängig machen (git restore)

bash
# Änderungen in einer Datei verwerfen (Working Directory)
git restore index.html

# Alle Änderungen im Arbeitsbereich verwerfen
git restore .

Erklärung:

  • ✅ Die Datei wird auf den Stand des letzten Commits zurückgesetzt
  • ✅ Änderungen gehen verloren

🔹 2. Staging-Area-Änderungen rückgängig machen (git restore --staged)

bash
# Datei aus der Staging Area entfernen (bleibt aber lokal erhalten)
git restore --staged index.html

# Alle Dateien aus der Staging Area entfernen
git restore --staged .

Erklärung:

  • ✅ Die Datei bleibt im Working Directory unverändert
  • ✅ Sie wird nur aus der Staging area entfernt

🔹 3. Letzten Commit ändern (git commit --amend)

bash
# Letzten Commit ändern (Nachricht oder Inhalt)
git commit --amend -m "Neue Commit-Nachricht"

# Dateien zum letzten Commit hinzufügen
git add vergessene-datei.js
git commit --amend --no-edit  # --no-edit behält die alte Nachricht bei

⚠️ Achtung:

  • Verwenden Sie --amend nicht, wenn Sie den Commit bereits gepusht haben!

🔹 4. Alten Commit sicher rückgängig machen (git revert)

bash
# Einen bestimmten Commit rückgängig machen (erstellt einen neuen Commit)
git revert a1b2c3d

# Ohne Commit (Änderungen nur im Working Directory)
git revert --no-commit a1b2c3d

Vorteile:

  • Sicher: Der ursprüngliche Commit bleibt in der Historie
  • Team-freundlich: Keine Probleme beim Pushen

🔹 5. Commits löschen (git reset --hard) (⚠️ Gefährlich!)

bash
# Letzten Commit löschen (alle Änderungen gehen verloren!)
git reset --hard HEAD~1

# Zu einem alten Commit zurückkehren (alle nachfolgenden Commits löschen)
git reset --hard a1b2c3d

⚠️ Warnung:

  • Dies löscht alle nachfolgenden Commits unwiderruflich!
  • Verwenden Sie es nur, wenn Sie wirklich alles verwerfen möchten.

4.3 Dateien umbenennen und löschen (git mv, git rm)

🔹 1. Dateien umbenennen (git mv)

bash
# Datei umbenennen (und automatisch zur Staging Area hinzufügen)
git mv alter-name.js neuer-name.js

# Dann committen
git commit -m "Rename: alter-name.js zu neuer-name.js"

Erklärung:

  • git mv ist dasselbe wie:
    bash
    mv alter-name.js neuer-name.js
    git add neuer-name.js
    git rm alter-name.js

🔹 2. Dateien löschen (git rm)

bash
# Datei löschen (und aus der Staging Area entfernen)
git rm datei.js

# Datei nur aus dem Repository entfernen (lokal behalten)
git rm --cached datei.js

# Dann committen
git commit -m "Remove: datei.js gelöscht"

Optionen:

OptionErklärung
git rm <datei>Löscht Datei lokal und aus dem Repository
git rm --cached <datei>Löscht Datei nur aus dem Repository (bleibt lokal erhalten)
git rm -r ordner/Löscht einen Ordner rekursiv

4.4 Dateiänderungen anzeigen (git diff)

📖 Was ist git diff?

git diff zeigt Unterschiede zwischen verschiedenen Zuständen.


🔹 1. Arbeitsbereich vs. Staging Area

bash
# Zeige alle nicht gespeicherten Änderungen (Working Dir vs. Staging)
git diff

Ausgabe-Beispiel:

diff
diff --git a/index.html b/index.html
index 83db1a2..f3a5b6c 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
 <h1>Willkommen</h1>
+<p>Neuer Paragraph</p>

🔹 2. Staging Area vs. Repository (Letzter Commit)

bash
# Zeige Änderungen in der Staging Area (Staging vs. letzter Commit)
git diff --staged

# oder
git diff --cached

🔹 3. Arbeitsbereich vs. Repository (Letzter Commit)

bash
# Zeige alle Änderungen (Working Dir + Staging vs. letzter Commit)
git diff HEAD

🔹 4. Zwischen zwei Commits vergleichen

bash
# Unterschied zwischen zwei Commits anzeigen
git diff a1b2c3d..e4f5g6h

# Kurze Zusammenfassung (nur Dateinamen)
git diff --stat a1b2c3d..e4f5g6h

# Bestimmte Datei vergleichen
git diff a1b2c3d..e4f5g6h -- index.html

🔹 5. Zwischen zwei Branches vergleichen

bash
# Unterschied zwischen main und feature-branch
git diff main..feature-branch

# Welche Dateien wurden geändert?
git diff --name-only main..feature-branch

4.5 Lokales Repository sichern und migrieren

🔹 1. Lokales Repository kopieren (Backup)

bash
# Methode 1: Einfaches Kopieren (funktioniert, da .git enthalten ist)
cp -r mein-projekt/ backup-projekt/

# Methode 2: Neues Clone erstellen (empfohlener)
git clone /pfad/zu/mein-projekt backup-projekt

🔹 2. Repository auf einen neuen Remote-Server migrieren

bash
# 1. Bestehendes Repository klonen (oder im bestehenden arbeiten)
cd mein-projekt

# 2. Alten Remote entfernen
git remote remove origin

# 3. Neuen Remote hinzufügen
git remote add origin https://github.com/neuer-user/neues-projekt.git

# 4. Alle Branches und Tags pushen
git push -u origin --all
git push -u origin --tags

🔹 3. Bundle erstellen (Für Offline-Transfer)

bash
# Bundle-Datei erstellen (enthält gesamtes Repository)
git bundle create mein-projekt.bundle --all

# Bundle auf einem anderen Computer klonen
git clone mein-projekt.bundle neues-projekt

4.6 Häufige Fehler und Lösungen

❌ Fehler 1: "fatal: not a git repository"

Ursache: Sie sind nicht in einem Git-Repository.

Lösung:

bash
# Überprüfen, ob .git-Ordner existiert
ls -la  # Mac/Linux
dir /a   # Windows

# Falls nicht, Repository initialisieren
git init

❌ Fehler 2: "error: failed to push some refs"

Ursache: Remote hat Commits, die lokal nicht vorhanden sind.

Lösung:

bash
# Zuerst pullen (fetch + merge)
git pull origin main

# Dann pushen
git push origin main

❌ Fehler 3: "fatal: ambiguous argument"

Ursache: Ungültige Commit-Referenz.

Lösung:

bash
# Überprüfen Sie den Commit-Hash
git log --oneline

# Verwenden Sie den korrekten Hash
git reset --hard a1b2c3d  # Beispiel

❌ Fehler 4: Datei wurde aus Versehen gelöscht

Lösung (wenn die Datei committet war):

bash
# Datei aus dem letzten Commit wiederherstellen
git checkout HEAD -- index.html

Lösung (wenn die Datei nicht committet war):

  • ❌ Kann nicht wiederhergestellt werden, es sei denn, Sie haben ein Backup.

❌ Fehler 5: "Permission denied" beim Pushen

Ursache: Keine Berechtigung für das Remote-Repository.

Lösung:

  • ✅ Überprüfen Sie Ihren SSH-Key oder Ihr Token
  • ✅ Stellen Sie sicher, dass Sie Schreibzugriff haben
bash
# SSH-Key testen (GitHub)
ssh -T git@github.com

# Falls Fehler, SSH-Key erstellen und bei GitHub hinterlegen

📝 Zusammenfassung

In diesem Kapitel haben Sie gelernt:

  • git log erweitert nutzen (Filtern, Formatieren, Grafiken)
  • Änderungen rückgängig machen (restore, reset, revert, amend)
  • Dateien umbenennen und löschen (mv, rm)
  • Unterschiede anzeigen (git diff in allen Varianten)
  • Lokales Repository sichern (Kopieren, Migrieren, Bundle)
  • Häufige Fehler beheben

Nächstes Kapitel: Wir werden Branching & Merging lernen (Git-Kernfunktion).



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

Frei für alle Anfänger