Git-Tipps nicht nur für Consultants

Git für … Consultants

Praxis-Tipps für den Umgang mit mehreren Kundenprojekten

Avatar von Martin Holzhauer

Wer kennt es nicht? Als Consultant arbeitet man für verschiedene Kunden, hat unterschiedliche Projekte am Laufen und muss ständig zwischen verschiedenen Codebasen jonglieren. Git ist dabei unser treuer Begleiter, aber mal ehrlich – nutzen wir wirklich sein volles Potenzial?

In diesem Blogpost möchte ich dir ein paar ausgefallenere Git-Features zeigen, die mir im Consulting-Alltag das Leben deutlich leichter machen. Kein trockenes Handbuch-Zeug, versprochen! Nur praktische Tipps, die dir Zeit sparen und Kopfschmerzen ersparen werden.

Unterschiedliche gitconfig für unterschiedliche Kunden

Auch das kennt man: Montags committest du für Kunde A mit deiner Firmen-E-Mail, dienstags für Kunde B mit einer projektspezifischen Adresse, und am Freitag versehentlich mit der falschen E-Mail für den falschen Kunden? Mega nervig.

Die Lösung: includeIf in deiner Git-Konfiguration. Damit kannst du kundenspezifische Git-Einstellungen definieren, die automatisch aktiviert werden, je nachdem, in welchem Verzeichnis du arbeitest.

So könnte deine .gitconfig aussehen:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[user]
name = Max Mustermann
email = max.mustermann@meine-firma.de
[includeIf "gitdir:~/projekte/kunde-a/"]
path = ~/.gitconfig-kunde-a
[includeIf "gitdir:~/projekte/kunde-b/"]
path = ~/.gitconfig-kunde-b
[user] name = Max Mustermann email = max.mustermann@meine-firma.de [includeIf "gitdir:~/projekte/kunde-a/"] path = ~/.gitconfig-kunde-a [includeIf "gitdir:~/projekte/kunde-b/"] path = ~/.gitconfig-kunde-b
[user]
    name = Max Mustermann
    email = max.mustermann@meine-firma.de
[includeIf "gitdir:~/projekte/kunde-a/"]
    path = ~/.gitconfig-kunde-a
[includeIf "gitdir:~/projekte/kunde-b/"]
    path = ~/.gitconfig-kunde-b

Und in .gitconfig-kunde-a:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[user]
email = max.mustermann@kunde-a.de
[user] email = max.mustermann@kunde-a.de
[user]
    email = max.mustermann@kunde-a.de

Schon ist Schluss mit den falschen E-Mail-Adressen. Du kannst dort natürlich auch andere Git-Settings wie Signing-Keys oder spezielle Aliase definieren.

Git Worktree

Manchmal möchte man parallel an mehreren Branches arbeiten, ohne ständig zwischen ihnen hin und her zu wechseln. Genau dafür gibt’s Git Worktree.

Goodies von Mayflower

 

Das klingt nach einem Thema, dass Dich in Deinem Alltag bei euch beschäftigt? Das Dich mit vielen Fragen zurück lässt?

Keine Sorge – Hilfe ist nah! Melde Dich unverbindlich bei uns und wir schauen uns gemeinsam an, ob und wie wir Dich unterstützen können.

Stell dir folgendes vor: Du arbeitest an einem Feature und plötzlich kommt ein dringender Bugfix rein. Normalerweise würdest du deinen aktuellen Stand committen oder stashen, den Branch wechseln, und später wieder zurückkehren. Mit Worktree geht das wesentlich eleganter:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Erstellt einen neuen Worktree für den Bugfix
git worktree add ../projekt-bugfix bugfix-branch
# Im neuen Verzeichnis arbeiten
cd ../projekt-bugfix
# ... Bugfix implementieren und committen ...
# Zurück zum Hauptprojekt
cd ../hauptprojekt
# Wenn fertig, Worktree entfernen
git worktree remove ../projekt-bugfix
# Erstellt einen neuen Worktree für den Bugfix git worktree add ../projekt-bugfix bugfix-branch # Im neuen Verzeichnis arbeiten cd ../projekt-bugfix # ... Bugfix implementieren und committen ... # Zurück zum Hauptprojekt cd ../hauptprojekt # Wenn fertig, Worktree entfernen git worktree remove ../projekt-bugfix
# Erstellt einen neuen Worktree für den Bugfix
git worktree add ../projekt-bugfix bugfix-branch
# Im neuen Verzeichnis arbeiten
cd ../projekt-bugfix
# ... Bugfix implementieren und committen ...
# Zurück zum Hauptprojekt
cd ../hauptprojekt
# Wenn fertig, Worktree entfernen
git worktree remove ../projekt-bugfix

Super praktisch ist das auch für:

  • Code-Reviews durchführen, während du weiter an eurem Feature arbeitest
  • Verschiedene Versionen deiner App parallel laufen lassen, um Funktionen zu vergleichen
  • Schnelles Testen von PRs, ohne den aktuellen Arbeitsstand zu verlieren

Git Sparse-Checkout

Monorepos sind toll für Kunden, aber manchmal der Horror für uns Consultants. Wenn du nur an einem kleinen Teil eines riesigen Repos arbeitest, warum das ganze Ding runterladen?

Mit Sparse-Checkout kannst du selektiv nur die Teile auschecken, die du wirklich brauchst:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Repo initialisieren, aber noch keine Dateien auschecken
git clone --filter=blob:none --no-checkout <https://github.com/kunde/monorepo.git>
cd monorepo
# Nur die benötigten Verzeichnisse auschecken
git sparse-checkout set frontend/mein-modul config/shared
# Jetzt normal arbeiten
git checkout main
# Repo initialisieren, aber noch keine Dateien auschecken git clone --filter=blob:none --no-checkout <https://github.com/kunde/monorepo.git> cd monorepo # Nur die benötigten Verzeichnisse auschecken git sparse-checkout set frontend/mein-modul config/shared # Jetzt normal arbeiten git checkout main
# Repo initialisieren, aber noch keine Dateien auschecken
git clone --filter=blob:none --no-checkout <https://github.com/kunde/monorepo.git>
cd monorepo
# Nur die benötigten Verzeichnisse auschecken
git sparse-checkout set frontend/mein-modul config/shared
# Jetzt normal arbeiten
git checkout main

Das spart nicht nur Speicherplatz, sondern macht auch Git-Operationen schneller, weil weniger Dateien verarbeitet werden müssen.

Git Notes

Wolltest du schon einmal Commits nachträglich mit Infos versehen, ohne sie zu ändern. Vielleicht Hinweise für Kollegen, Referenzen zu Tickets oder Notizen zur Implementierung.

Git Notes sind dafür perfekt:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Note zu einem Commit hinzufügen
git notes add -m "Achtung: Dieser Fix funktioniert nur mit DB-Version 5.7+" a1b2c3d4
# Notes anzeigen
git log --show-notes
# Notes mit dem Remote teilen
git push origin refs/notes/*
# Note zu einem Commit hinzufügen git notes add -m "Achtung: Dieser Fix funktioniert nur mit DB-Version 5.7+" a1b2c3d4 # Notes anzeigen git log --show-notes # Notes mit dem Remote teilen git push origin refs/notes/*
# Note zu einem Commit hinzufügen
git notes add -m "Achtung: Dieser Fix funktioniert nur mit DB-Version 5.7+" a1b2c3d4
# Notes anzeigen
git log --show-notes
# Notes mit dem Remote teilen
git push origin refs/notes/*

Besonders cool dabei: Die Notes verändern den Commit-Hash nicht, du kannst also nachträglich Informationen ergänzen, ohne die Git-Historie zu verfälschen.

Git Commit Signieren mittels SSH Key

GPG-Keys zum Signieren von Commits sind super, aber ehrlich gesagt manchmal ein Krampf in der Einrichtung. Die gute Nachricht: Du kannst jetzt auch mit deinem SSH-Key signieren, den du wahrscheinlich sowieso schon nutzt.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# In deiner .gitconfig
[user]
signingkey = ~/.ssh/id_ed25519.pub
[gpg]
format = ssh
[commit]
gpgsign = true
# In deiner .gitconfig [user] signingkey = ~/.ssh/id_ed25519.pub [gpg] format = ssh [commit] gpgsign = true
# In deiner .gitconfig
[user]
    signingkey = ~/.ssh/id_ed25519.pub
[gpg]
    format = ssh
[commit]
    gpgsign = true

Wenn du deinen SSH-Key bei GitHub oder GitLab hinterlegt hast, werden deine Commits automatisch als verifiziert angezeigt. Kein GPG-Gedöns mehr!

Hier auch wieder der Hinweis auf includeIf, um getrennte Signierschlüssel je Kunde zu haben

Binär-Dateien Diffen

Wir alle wissen, dass Binärdateien in Git ein Albtraum sein können. Aber manchmal lässt es sich nicht vermeiden, Excel-Dateien, PDFs oder andere Binaries ins Repo zu packen.

Git erlaubt dir, externe Diff-Tools für bestimmte Dateitypen zu konfigurieren:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# In .gitconfig oder .git/config
[diff "excel"]
textconv = sh -c 'xlsx2csv -a "$0"' # -a parameter ist hier, um alle Sheets zu exportieren
binary = true
# In .gitconfig oder .git/config [diff "excel"] textconv = sh -c 'xlsx2csv -a "$0"' # -a parameter ist hier, um alle Sheets zu exportieren binary = true
# In .gitconfig oder .git/config
[diff "excel"]
    textconv = sh -c 'xlsx2csv -a "$0"' # -a parameter ist hier, um alle Sheets zu exportieren
    binary = true

Und in .gitattributes:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
*.xlsx diff=excel
*.xlsx diff=excel
*.xlsx diff=excel

Jetzt kannst du mit git diff tatsächlich sehen, was sich in deinen Excel-Dateien geändert hat. Für xlsx2csv musst du lediglich das entsprechende Tool installieren (pip install xlsx2csv).

Ähnlich funktioniert das bei PDFs mit pdftotext, bei Bildern mit exiftool – und es gibt Lösungen für viele andere Formate.

Die .gitattributes-Datei ist Repo-spezifisch, du kannst dir aber auch eine Globale Datei in der ~/.gitconfig definieren:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[core]
attributesfile = /home/user/.gitattributes
[core] attributesfile = /home/user/.gitattributes
[core]
attributesfile = /home/user/.gitattributes

Git Convenience

Zum Schluss noch ein paar schnelle Tipps, die deinen Git-Workflow auf das nächste Level heben:

Word-Diff für detaillierte Textänderungen

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
git diff --word-diff
git diff --word-diff
git diff --word-diff

Zeigt Änderungen auf Wortebene statt Zeilenebene an.

Bessere Diff-Algorithmen

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[diff]
algorithm = histogram
[diff] algorithm = histogram
[diff]
    algorithm = histogram

Der Histogram-Algorithmus erkennt Strukturen besser und liefert oft sinnvollere Diffs. Es ist der neuste Diff Algorithmus in Git.

Autostash

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[rebase]
autostash = true
[rebase] autostash = true
[rebase]
    autostash = true

Stashed automatisch deine Änderungen vor einem Rebase und wendet sie danach wieder an.

Branches nach Commit-Datum sortieren

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[branch]
sort = -committerdate
[branch] sort = -committerdate
[branch]
    sort = -committerdate

Zeigt die zuletzt bearbeiteten Branches zuerst an.

Branches automatisch in Spalten anzeigen

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[column]
ui = auto
[column] ui = auto
[column]
    ui = auto

Übersichtlicher, vor allem bei vielen Branches.

Branches ohne Mehraufwand pushen

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[push]
autoSetupRemote = true
[push] autoSetupRemote = true
[push]
    autoSetupRemote = true

Kein --set-upstream mehr nötig beim ersten Push eines neuen Branches.

Tags besser sortieren

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[tag]
sort = version:refname
[tag] sort = version:refname
[tag]
    sort = version:refname

Sortiert Tags semantisch (v1.10 kommt nach v1.9, nicht davor).

Autocorrect für Tippfehler

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[help]
autocorrect = prompt
[help] autocorrect = prompt
[help]
    autocorrect = prompt

Git schlägt Korrekturen vor, wenn du dich vertippst.

Automatisches Aufräumen

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[fetch]
prune = true
pruneTags = true
[fetch] prune = true pruneTags = true
[fetch]
    prune = true
    pruneTags = true

Entfernt automatisch Referenzen zu gelöschten Remote-Branches und Tags.

Rerere-Feature aktivieren

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[rerere]
enabled = true
[rerere] enabled = true
[rerere]
    enabled = true

Git „erinnert“ sich an frühere Konfliktlösungen und wendet sie automatisch an.

Verbose Commits

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[commit]
verbose = true
[commit] verbose = true
[commit]
    verbose = true

Zeigt den Diff im Commit-Editor an, nicht nur die Statusliste.

Git Pull mit Rebase

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[pull]
rebase = true
[pull] rebase = true
[pull]
    rebase = true

Verwendet Rebase statt Merge beim Pullen, für eine sauberere Historie. Hier vor allem im Zusammenhang mit Autostashing sehr hilfreich.

Zusammenfassung

So, das waren meine liebsten Git-Tricks für den Consulting-Alltag. Mit diesen Tools im Gepäck kannst du flexibler zwischen Projekten wechseln, effizienter arbeiten und weniger Zeit mit Git-Problemen verschwenden.

Allerdings ist mir klar, dass ich nicht alles kennen kann … hast du noch andere coole Git-Features, die dir das Leben leichter machen? Lasst es mich in den Kommentaren wissen!

Für alle, die noch tiefer einsteigen wollen, kann ich folgende Ressourcen empfehlen:

Happy Coding und bis zum nächsten Mal!

Goodies von Mayflower

Keine Sorge – Hilfe ist nah! Melde Dich unverbindlich bei uns und wir schauen uns gemeinsam an, ob und wie wir Dich unterstützen können.

Unsere Data-Webinar-Reihe

Avatar von Martin Holzhauer

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.