Skip to content

Kapitel 14: Weiterführende Lernswege

14.1 Fortgeschrittene Git-Funktionen

📖 git rebase (Fortgeschrittene)

Was ist git rebase?

  • rebase verschiebt Commits auf einen neuen Basis-Commit.
  • Im Gegensatz zu merge wird die Historie linear (keine Merge-Commits).

🔹 1. Einfaches Rebase

bash
# Auf feature-branch
git checkout feature-login

# Develop in feature-branch rebasen
git rebase develop

Ergebnis:

Vorher:
develop:   A --- B
                    \
feature:             C --- D

Nachher (rebase):
develop:   A --- B --- C' --- D'

🔹 2. Interaktives Rebase (git rebase -i)

Mit interaktivem Rebase können Sie die Historie bereinigen (vor dem Pushen!).

bash
# Letzte 3 Commits bereinigen
git rebase -i HEAD~3

Öffnet einen Editor mit Optionen:

pick a1b2c3d Erster Commit
pick e4f5g6h Zweiter Commit
pick i7j8k9l Dritter Commit

# Befehle:
# p, pick = Commit verwenden
# r, reword = Commit-Nachricht ändern
# e, edit = Commit anhalten (um ihn zu ändern)
# s, squash = Commit mit vorherigem zusammenfassen
# d, drop = Commit löschen

Beispiel (Commits zusammenfassen):

pick a1b2c3d Erster Commit
squash e4f5g6h Zweiter Commit
pick i7j8k9l Dritter Commit

🔹 3. rebase vs. merge (Vergleich)

Aspektrebasemerge
HistorieLinear, sauberVerzweigt, mit Merge-Commits
SicherheitGefährlich (ändert Historie)Sicher (ändert keine Historie)
EmpfehlungNur für lokale, nicht gepushte CommitsFür alle geteilten Branches

Goldene Regel:

Rebasen Sie niemals Commits, die Sie bereits gepusht haben!


14.2 git cherry-pick (Einzelne Commits anwenden)

📖 Was ist git cherry-pick?

cherry-pick wendet die Änderungen eines einzelnen Commits auf einen anderen Branch an.


🔹 1. Cherry-Pick verwenden

bash
# 1. Commit-Hash finden, den Sie anwenden möchten
git log --oneline feature-branch

# Ausgabe:
# a1b2c3d Feature: Login hinzugefügt

# 2. Auf Ziel-Branch wechseln
git checkout develop

# 3. Cherry-Pick ausführen
git cherry-pick a1b2c3d

Ergebnis:

  • Die Änderungen von a1b2c3d werden auf develop angewendet.
  • Es wird ein neuer Commit mit neuem Hash erstellt.

🔹 2. Cherry-Pick bei Konflikten

Wenn ein Konflikt auftritt:

bash
# 1. Konflikt lösen (Datei bearbeiten)
# 2. Datei zur Staging Area hinzufügen
git add konflikt-datei.js

# 3. Cherry-Pick fortsetzen
git cherry-pick --continue

# Oder abbrechen:
git cherry-pick --abort

🔹 3. Anwendungsfall für Cherry-Pick

Szenario: Sie haben einen Bugfix in feature-A gemacht, brauchen ihn aber dringend in main.

bash
# 1. Auf main wechseln
git checkout main

# 2. Bugfix-Commit (aus feature-A) cherry-picken
git cherry-pick bugfix-commit-hash

14.3 CI/CD und Git (Überblick)

📖 Was ist CI/CD?

  • CI (Continuous Integration): Automatisches Bauen und Testen bei jedem Push.
  • CD (Continuous Deployment): Automatisches Bereitstellen (Deployment) nach erfolgreichem CI.

🔹 1. CI/CD mit GitHub Actions (Beispiel)

Datei: .github/workflows/ci.yml

yaml
name: CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm install
      - run: npm test

Was passiert?

  • Bei jedem Push auf main/develop oder PR wird:
    1. Repository ausgecheckt
    2. Node.js installiert
    3. Abhängigkeiten installiert (npm install)
    4. Tests ausgeführt (npm test)

🔹 2. CI/CD mit GitLab CI

Datei: .gitlab-ci.yml

yaml
stages:
  - test
  - deploy

test:
  stage: test
  script:
    - npm install
    - npm test

deploy:
  stage: deploy
  script:
    - npm run build
    - ./deploy.sh
  only:
    - main

🔹 3. Best Practices für CI/CD

TippErklärung
Tests schreibenCI ist nutzlos ohne Tests
Schnelle BuildsCI sollte in < 10 Minuten fertig sein
Kleine CommitsEinfacher zu debuggen bei Fehlern
Branches schützenmain nur via PR mergen (mit CI-Check)

14.4 Git-Interna (Objekte, Referenzen)

📖 Git-Objekte (Vereinfacht)

Git speichert Daten in 4 Objekttypen:

ObjekttypErklärung
BlobDateiinhalt (binär)
TreeVerzeichnisstruktur (Zeigt auf Blobs und andere Trees)
CommitSnapshot (Zeigt auf Tree, hat Autor, Nachricht, etc.)
TagZeigt auf einen Commit (für Releases)

🔹 1. .git-Ordner untersuchen

bash
# .git/objects auflisten
find .git/objects -type f

# Ein Objekt anzeigen (ersten 2 Zeichen des Hashes sind der Ordnername)
git cat-file -p a1b2c3d

Beispielausgabe (Commit-Objekt):

tree e4f5g6h...
parent i7j8k9l...
author Max Mustermann <max@example.com> 1716825600 +0200
committer Max Mustermann <max@example.com> 1716825600 +0200

Feature: Login hinzugefügt

🔹 2. Referenzen (refs)

Referenzen sind Zeiger auf Commits.

Referenz-TypPfadErklärung
HEAD.git/HEADZeigt auf den aktuellen Branch (oder Commit)
Branch.git/refs/heads/Zeigt auf den letzten Commit des Branches
Remote.git/refs/remotes/Zeigt auf den letzten Commit des Remote-Branches
Tag.git/refs/tags/Zeigt auf einen Commit (oder ein Tag-Objekt)

Beispiel:

bash
# HEAD anzeigen
cat .git/HEAD
# Ausgabe: ref: refs/heads/main

# Branch-Referenz anzeigen
cat .git/refs/heads/main
# Ausgabe: a1b2c3d... (Hash des letzten Commits)

🔹 3. git gc (Garbage Collection)

Git bereinigt automatisch unnötige Objekte.

bash
# Manuell ausführen (oft nicht nötig)
git gc --aggressive

Wann ist git gc nützlich?

  • Nach vielen git rebase oder git reset Operationen
  • Wenn das Repository sehr groß geworden ist

📝 Zusammenfassung

In diesem Kapitel haben Sie gelernt:

  • git rebase (und warum man es mit Vorsicht genießen sollte)
  • git cherry-pick (einzelne Commits anwenden)
  • CI/CD-Grundlagen (GitHub Actions, GitLab CI)
  • Git-Interna (Objekte, Referenzen, .git-Ordner)

Nächstes Kapitel: Wir werden Lernressourcen empfehlen (Bücher, Kurse, Tools).



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

Frei für alle Anfänger