GITHUB EINFUEHRUNG - GIT UND GITHUB VERSTEHEN
=============================================

WAS IST GIT?
------------
Git ist ein verteiltes Versionskontrollsystem (VCS), entwickelt
2005 von Linus Torvalds fuer die Linux-Kernel-Entwicklung.

Vorteile:
- Jede Aenderung wird protokolliert
- Aeltere Versionen koennen wiederhergestellt werden
- Mehrere Entwickler koennen parallel arbeiten
- Offline-Arbeit moeglich (lokales Repository)
- Schnell und effizient (auch bei grossen Projekten)

WAS IST GITHUB?
---------------
GitHub ist eine Web-Plattform, die Git-Repositories hostet
und zusaetzliche Funktionen bietet:

- Remote-Hosting fuer Git-Repositories
- Web-Oberflaeche fuer Code-Browsing
- Issue-Tracking (Bug-Reports, Feature-Requests)
- Pull Requests (Code-Review-Workflow)
- GitHub Actions (CI/CD-Automatisierung)
- GitHub Pages (kostenlose Webseiten)
- Projekt-Management (Projects, Milestones)

Alternativen: GitLab, Bitbucket, Gitea (self-hosted)

DIE DREI BEREICHE VON GIT
-------------------------
Git arbeitet mit drei lokalen Bereichen:

  +----------------+    git add    +--------+   git commit   +------+
  | Working        | ------------> | Stage  | -------------> | HEAD |
  | Directory      |               | (Index)|                |      |
  | (Arbeitskopie) | <------------ |        | <------------- |      |
  +----------------+  git checkout +--------+   git reset    +------+
        |                                                        |
        |                   git push / git fetch                 |
        +----------------------- REMOTE -------------------------+

  1. Working Directory: Deine echten Dateien
  2. Staging Area (Index): Vorbereitete Aenderungen
  3. HEAD: Letzter Commit im aktuellen Branch

GRUNDLEGENDE GIT-BEFEHLE
------------------------
Repository erstellen/klonen:

  git init                    Neues Repository erstellen
  git clone <url>             Bestehendes Repository kopieren

Aenderungen verwalten:

  git status                  Status anzeigen (geaenderte Dateien)
  git diff                    Aenderungen im Detail anzeigen
  git add <datei>             Datei zum Staging hinzufuegen
  git add .                   Alle Aenderungen stagen
  git commit -m "Nachricht"   Commit erstellen
  git log                     Commit-Historie anzeigen

Mit Remote arbeiten:

  git remote add origin <url> Remote-Repository verknuepfen
  git push                    Commits hochladen
  git pull                    Aenderungen herunterladen
  git fetch                   Aenderungen holen (ohne Merge)

Branches:

  git branch                  Branches auflisten
  git branch <name>           Neuen Branch erstellen
  git checkout <name>         Branch wechseln
  git checkout -b <name>      Branch erstellen und wechseln
  git merge <branch>          Branch zusammenfuehren

TYPISCHER WORKFLOW
------------------
1. Repository klonen oder erstellen

     git clone https:/github.com/user/projekt.git
     cd projekt

2. Neuen Branch fuer Feature erstellen

     git checkout -b feature/neue-funktion

3. Code aendern und committen

     # ... Code bearbeiten ...
     git add .
     git commit -m "feat: neue Funktion hinzugefuegt"

4. Aenderungen hochladen

     git push -u origin feature/neue-funktion

5. Pull Request auf GitHub erstellen

     -> Auf GitHub: "Compare & pull request"
     -> Code-Review durch Teammitglieder
     -> Merge nach Freigabe

PULL REQUESTS VERSTEHEN
-----------------------
Ein Pull Request (PR) ist ein Vorschlag, Aenderungen von
einem Branch in einen anderen zu uebernehmen.

Workflow:
  1. Feature-Branch erstellen
  2. Commits machen
  3. Push zu GitHub
  4. PR erstellen
  5. Review anfordern
  6. Aenderungen einarbeiten (falls noetig)
  7. Approval erhalten
  8. Merge durchfuehren

MERGE VS REBASE
---------------
Zwei Methoden um Branches zusammenzufuehren:

  Merge (Standard):
  - Erstellt einen Merge-Commit
  - Historie bleibt vollstaendig erhalten
  - Gut fuer Team-Zusammenarbeit

    git checkout main
    git merge feature/xyz

  Rebase:
  - Schreibt Commits auf neuen Basis-Commit um
  - Lineare Historie
  - Achtung: Nie oeffentliche Commits rebasen!

    git checkout feature/xyz
    git rebase main

KONFLIKTE LOESEN
----------------
Wenn zwei Branches dieselbe Stelle aendern:

  1. Git zeigt Konflikt an
  2. Datei manuell bearbeiten:

       <<<<<<< HEAD
       Deine Aenderung
       =======
       Andere Aenderung
       >>>>>>> branch-name

  3. Konfliktmarkierungen entfernen, Code korrigieren
  4. git add <datei>
  5. git commit (oder git rebase --continue)

WICHTIGE .GITIGNORE REGELN
--------------------------
Dateien die NICHT ins Repository gehoeren:

  # Umgebungsvariablen (Passwoerter, API-Keys!)
  .env
  .env.local

  # Abhaengigkeiten (werden per npm/pip installiert)
  node_modules/
  venv/
  __pycache__/

  # Build-Artefakte
  dist/
  build/
  *.pyc

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

  # Betriebssystem
  .DS_Store
  Thumbs.db

HAEUFIGE FEHLER VERMEIDEN
-------------------------
1. Passwörter/API-Keys committen
   -> Immer .env nutzen und in .gitignore aufnehmen
   -> Wenn versehentlich committed: Keys sofort rotieren!

2. Grosse Binaerdateien committen
   -> Git ist fuer Text optimiert
   -> Fuer grosse Dateien: Git LFS nutzen

3. Auf main/master direkt pushen
   -> Immer Feature-Branches nutzen
   -> Code-Review via Pull Requests

4. Force-Push auf oeffentliche Branches
   -> Ueberschreibt Historie anderer
   -> Nur auf eigenen Feature-Branches

5. Unvollstaendige Commits
   -> Jeder Commit sollte funktionieren
   -> Atomic Commits: Eine logische Aenderung pro Commit

GIT KONFIGURATION
-----------------
Wichtige Einstellungen:

  # Name und Email (global)
  git config --global user.name "Dein Name"
  git config --global user.email "email@example.com"

  # Standard-Branch-Name
  git config --global init.defaultBranch main

  # Editor fuer Commit-Messages
  git config --global core.editor "code --wait"

  # Zeilenenden (Windows)
  git config --global core.autocrlf true

GITHUB-SPEZIFISCHE FEATURES
---------------------------
Issues:
- Bug-Reports und Feature-Requests
- Labels zur Kategorisierung
- Milestones fuer Releases
- Assignees fuer Zustaendigkeit

Projects:
- Kanban-Boards fuer Projektmanagement
- Automatisierung moeglich

Actions:
- CI/CD-Pipelines
- Automatische Tests bei jedem Push
- Automatische Deployments

Pages:
- Kostenlose Webseiten-Hosting
- Statische Seiten aus Repository

Releases:
- Versionierte Software-Releases
- Download-Links fuer Benutzer
- Changelog pro Version

GITHUB CLI (GH)
---------------
Kommandozeilen-Tool fuer GitHub:

  gh repo clone user/repo     Repository klonen
  gh repo create              Neues Repository
  gh pr create                Pull Request erstellen
  gh pr list                  Pull Requests auflisten
  gh issue create             Issue erstellen
  gh issue list               Issues auflisten
  gh workflow run             Action starten

SSH VS HTTPS
------------
Zwei Wege um sich mit GitHub zu verbinden:

  HTTPS:
  - URL: https:/github.com/user/repo.git
  - Authentifizierung: Username + Token
  - Einfacher einzurichten

  SSH:
  - URL: git@github.com:user/repo.git
  - Authentifizierung: SSH-Key
  - Komfortabler (kein Token bei jedem Push)

SSH-Key einrichten:
  1. ssh-keygen -t ed25519 -C "email@example.com"
  2. Public Key auf GitHub hinzufuegen
     (Settings -> SSH and GPG keys)

RESSOURCEN
----------
Offizielle Dokumentation:
- https:/git-scm.com/doc
- https:/docs.github.com

Interaktive Tutorials:
- https:/learngitbranching.js.org (visuell)
- https:/rogerdudler.github.io/git-guide/index.de.html

Cheat Sheets:
- https:/education.github.com/git-cheat-sheet-education.pdf

SIEHE AUCH
----------
wiki/github_konventionen.txt   Standard-Dateien und Namensregeln
