Git
Setup
git config --global user.name "…"
git config --global user.email "…"
Create Project
cd testProject
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/.../REPO_NAME.git
git push -u origin main
Commands
git add .
git commit -m "Message"
git push
Wetere nützliche Commands
git log
git log --graph --oneline --decorate --all
git checkout 3f34s5d5
git branch // shows current branch
git checkout -b newbranch // create new branch
git push origin new-branch
git pull origin master
git rm --cached <datei/ordner> // Gepusht und im Nachhinein gitignore werden gelöscht.
git merge <id> // Vereint den aktuellen Zweig mit dem angegebenen Zweig
git config --global alias.co checkout
// C:\user\max\.git\config
SSH
ssh -v
ssh-keygen ed25519
Location und Passphase leer lassen
C:\Users\<name>\.ssh\id_ed25519 öffnen und kopieren
Public key in Gitlab einfügen
ssh –T gitlab.microsoft.com
Fortgeschrittene Git-Befehle
# Änderungen stagen und committen in einem Befehl
git commit -am "Nachricht"
# Interaktives Staging (einzelne Teile einer Datei stagen)
git add -p
# Commits zusammenführen (Squash)
git rebase -i HEAD~3 # Die letzten 3 Commits bearbeiten
# Änderungen temporär speichern (Stash)
git stash save "Meine Änderungen"
git stash list
git stash apply stash@{0}
git stash pop # Letzten Stash anwenden und löschen
# Änderungen zwischen Commits anzeigen
git diff HEAD~1 HEAD # Unterschiede zwischen dem aktuellen und dem vorherigen Commit
# Branches vergleichen
git diff branch1..branch2
# Remote-Branches anzeigen
git branch -r
# Remote-Branch löschen
git push origin --delete branch-name
# Bestimmte Dateien zurücksetzen
git checkout -- file1 file2
# Vorherige Version einer Datei wiederherstellen
git checkout HEAD~1 -- file.txt
# Commit-Historie einer Datei anzeigen
git log --follow -p -- file.txt
# Tag erstellen und pushen
git tag -a v1.0.0 -m "Version 1.0.0"
git push origin v1.0.0
Branching-Strategien
GitFlow
master (oder main) - Produktionscode
develop - Entwicklungszweig
feature/* - Feature-Branches
release/* - Release-Kandidaten
hotfix/* - Schnellkorrekturen für Production
Typischer GitFlow-Ablauf:
# Feature starten
git checkout develop
git checkout -b feature/new-feature
# Feature abschließen
git checkout develop
git merge --no-ff feature/new-feature
git push origin develop
# Release starten
git checkout develop
git checkout -b release/1.0.0
# Versionsnummern anpassen, letzte Tests
# Release finalisieren
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0
git checkout develop
git merge --no-ff release/1.0.0
git push origin develop
git push origin main
git push origin --tags
GitHub Flow
Einfachere Alternative zu GitFlow:
main - Hauptzweig (immer deploybar)
feature/* - Feature-Branches (werden über Pull Requests in main gemerged)
Trunk-Based Development
main/trunk - Hauptentwicklungszweig
feature/* - Kurzlebige Feature-Branches (in der Regel < 1-2 Tage)
Git Hooks
Git Hooks sind Skripte, die vor oder nach bestimmten Git-Aktionen ausgeführt werden.
Pre-commit Hook Beispiel
Datei .git/hooks/pre-commit (ausführbar machen mit chmod +x):
#!/bin/sh
# Überprüfe auf Syntaxfehler in Python-Dateien
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$')
if [ -n "$FILES" ]; then
python -m flake8 $FILES
if [ $? -ne 0 ]; then
echo "Python-Fehler gefunden, Commit wird abgebrochen"
exit 1
fi
fi
# Keine Fehler gefunden
exit 0
Git Hooks mit Husky (für JavaScript-Projekte)
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.js": ["eslint --fix", "prettier --write", "git add"]
}
}
Git Workflows für Teams
Pull Request Workflow
# Fork des Repositories erstellen (über GitHub/GitLab UI)
# Fork klonen
git clone https://github.com/username/repository.git
cd repository
# Upstream hinzufügen
git remote add upstream https://github.com/original/repository.git
# Branch für Feature erstellen
git checkout -b feature/my-feature
# Änderungen committen
git add .
git commit -m "Add feature XYZ"
# Upstream-Änderungen holen und in den Branch rebasen
git fetch upstream
git rebase upstream/main
# Feature-Branch pushen
git push origin feature/my-feature
# Pull Request erstellen (über GitHub/GitLab UI)
Git Best Practices
-
Atomic Commits: Ein Commit sollte eine einzelne, logische Änderung repräsentieren.
-
Aussagekräftige Commit-Nachrichten: Format:
Kurzer Titel (max. 50 Zeichen)
Ausführlichere Beschreibung der Änderungen und ihrer
Auswirkungen. Kann mehrere Absätze umfassen.
(Leerzeilen zwischen den Absätzen)
Referenzen auf Issues: #123, #456 -
Regelmäßiges Rebasing/Merging: Feature-Branches regelmäßig mit dem Hauptzweig aktualisieren.
-
Branches aufräumen: Gelöschte Branches lokal entfernen:
git fetch --prune -
Git-Geschichte sauber halten:
# Interactive Rebase für Commit-Historie bereinigen
git rebase -i origin/main
Git Submodules und Subtrees
# Submodule hinzufügen
git submodule add https://github.com/user/repo.git path/to/submodule
# Submodules nach dem Klonen initialisieren
git submodule update --init --recursive
# Subtree hinzufügen
git subtree add --prefix=path/to/subtree https://github.com/user/repo.git main --squash
# Änderungen vom Subtree-Remote holen
git subtree pull --prefix=path/to/subtree https://github.com/user/repo.git main --squash
Git LFS (Large File Storage)
# Git LFS installieren
git lfs install
# Dateitypen für LFS verfolgen
git lfs track "*.psd"
git lfs track "*.zip"
# Status überprüfen
git lfs status
# Dateien abrufen
git lfs fetch
git lfs pull