1
 
 
Profil
In deinem persönlichen Profilbereich kannst du den Status deiner Bewerbung einsehen, unvollständige Bewerbungen zwischenspeichern und aktuelle News und Events einsehen
30. September 2024

Developer Hacks – Moderne Command Line Tools und Advanced Git Commands

Worum geht es in dem Artikel?

Die Arbeit mit dem Terminal und mit Git gehört zu den grundlegenden Techniken für Developer. Dieser Artikel stellt ein modernes Terminal-Setup, moderne Alternativen zu klassischen Shell-Programmen und fortgeschrittene Git-Befehle vor. Die Verwendung dieser Werkzeuge hilft dabei, sich in Projekten einfacher und schneller zu orientieren, um sich auf das zu konzentrieren, was wirklich wichtig ist: großartige Software zu entwickeln.

Developer Hacks – Moderne Command Line Tools und Advanced Git Commands

Terminal-Einrichtung für Mac

Für Mac-Benutzer bietet iTerm2 mehr Funktionen als das Standard-Mac-Terminal: geteilte Fenster, Hotkey-Fenster und umfangreiche Konfigurationsmöglichkeiten. Ich verwende es mit dem Catppuccin-Macchiato-Farbdesign und mag vor allem die Funktion, dass ein Scratchpad-Terminal per Hotkey schnell verfügbar ist:

Weitere nützliche Tools sind Rectangle für die Anordnung von Fenstern, Alt-Tab für den Fensterwechsel und Maccy für den Verlauf der Zwischenablage.

Shell: zsh und andere

Zsh, eine der beliebtesten Shells und die Standard-Shell auf Mac, kann mit oh-my-zsh angepasst werden, einem Framework, das die Verwaltung von zsh-Konfigurationen vereinfacht. Es wird oft zusammen mit der powerlevel10k-Prompt verwendet, um eine ansprechende und hilfreiche Terminal-Prompt zu erhalten. Zusätzlich kann die User Experience mit Plugins wie zsh-autosuggestions oder zsh-syntax-highlighting verbessert werden.

zsh mit „transient Prompt“ (vollständige Prompt wird bei vergangenen Befehlen ausgeblendet), Git-Infos, Syntaxhervorhebung (valide Befehle werden grün angezeigt) und automatischen Vorschlägen
zsh mit „transient Prompt“ (vollständige Prompt wird bei vergangenen Befehlen ausgeblendet), Git-Infos, Syntaxhervorhebung (valide Befehle werden grün angezeigt) und automatischen Vorschlägen

Neuere, aber weniger verbreitete Shells sind nushell, fish und xonsh. Ich finde xonsh besonders interessant, weil man damit sowohl Python- als auch Shell-Befehle nutzen kann.

Modern Shell Commands

Für viele der traditionellen Befehle wie ls, cat, find usw. gibt es moderne Alternativen. Im Vergleich zu den klassischen Gegenstücken sind diese Shell-Befehle oft schneller (da sie häufig in Rust geschrieben sind), haben farbige Hervorhebungen und sind im moderneren Entwicklungsumfeld praktischer, z. B. durch die Berücksichtigung von gitignore-Dateien.

ls-Alternativen: eza und lsd

eza und lsd bieten beide eine bessere Dateiliste mit farblicher Hervorhebung, Symbolen und zusätzlichen Konfigurationsmöglichkeiten.

Vergleich der Ausgaben für ls, lsd, eza und eza mit zusätzlichen Optionen
Vergleich der Ausgaben für ls, lsd, eza und eza mit zusätzlichen Optionen

bat: cat mit Flügeln

Bat ist ein Textbetrachter, der Zeilennummern, Syntaxhervorhebung und Git-Änderungen verwendet. Das Programm verwendet Paging für längere Ausgaben (scrollt den Text wie less), produziert aber unformatierte Ausgaben, wenn es für Befehls-Verknüpfungen („Piping“) verwendet wird.

Anzeige einer HTML-Datei mit bat, einschließlich Syntaxhervorhebung und Git-Integration
Anzeige einer HTML-Datei mit bat, einschließlich Syntaxhervorhebung und Git-Integration

du zu dust

Für die Anzeige von Datei- und Ordnergrößen bietet dust eine besser sortierte und visualisierte Ausgabe im Vergleich zu du:

Anzeige von Datei- und Ordnergrößen in dust
Anzeige von Datei- und Ordnergrößen in dust

fd: ein besseres find

fd ist eine moderne Alternative zu find, um nach Dateien zu suchen, deutlich schneller und mit einer einfacheren Syntax: fd PATTERN anstelle von find -iname '*PATTERN*'.

RIP, grep: ripgrep

Ein Werkzeug zum Suchen von Text in Dateien. Mit vernünftigen Standardeinstellungen berücksichtigt ripgrep die gitignore-Regeln und ignoriert versteckte und binäre Dateien. Deutlich schneller als das originale grep.

sed zu sd

sed wird in der Regel zum Ersetzen von Text verwendet. sd erledigt dies mit einer einfacheren Syntax:

Ersetzen von Text mit einfacherer Syntax in sd
Ersetzen von Text mit einfacherer Syntax in sd

htop-Alternativen: bottom, glances und btop

Für das klassische htop-Tool zur Überprüfung des Systemstatus gibt es moderne Alternativen wie z.B. bottom, glances oder btop(es gibt sogar noch mehr). Obwohl sie größtenteils dieselben Systemmetriken verwenden, unterscheiden sie sich in ihrer Anpassbarkeit und der Art und Weise, wie sie Daten anzeigen und visualisieren:

htop (oben links), btop (oben rechts), glances (unten links), btm (unten rechts)
htop (oben links), btop (oben rechts), glances (unten links), btm (unten rechts)

fzf: Fuzzy finder

fzf durchsucht Text mit einer sogenannten unscharfen Suche: Es findet auch leicht abweichende Schreibweisen, bei denen Zeichen weggelassen werden. Mit dem fzf-zsh-plugin kann man automatisch die Befehlshistorie mit fzf durchsuchen, wenn man ^R drückt.

What the fuck

The Fuck korrigiert automatisch Tippfehler in Konsolenbefehlen. Anstatt zurückzugehen und einen Tippfehler manuell zu korrigieren, gibt man einfach fuck ein und es wird der richtige Befehl vorgeschlagen (den man sofort ausführen kann):

Ausgabe von richtigem Befehl
Ausgabe von richtigem Befehl

Advanced Git Commands

Neben den Standard-Befehlen – git init, clone, git pull, add, commit, git push, diff oder show – gibt es einige Git-Funktionen, die einem in vielen Situationen das Leben erleichtern. Hier ist ein Überblick über diese hilfreichen Funktionen:

(Globale) Konfigurationsoptionen

Einige hilfreiche Optionen sind (werden mit git config -global gesetzt):

  • merge.conflictstyle zdiff3: Zeigt bei Merge-Konflikten zusätzlich zu den abweichenden Versionen auch die ursprünglichen Zeilen an
  • pull.rebase true: Den lokalen Branch automatisch rebasen, wenn der Upstream-Branch zusätzliche Commits hat
  • push.autoSetupRemote true: Wenn git push auf einem lokalen Branch ausgeführt wird, wird bei git push der entsprechende Remote-Branch automatisch eingerichtet
  • core.pager delta: Verwende delta, um die Ausgabe von z.B. git diff anzuzeigen

Schöneres Logging mit git oneline

Die Ausgabe von git log kann mit git log --pretty=oneline verkürzt und mit benutzerdefinierter Formatierung ansprechender gemacht werden, z. B. (Quelle):
git log --graph --pretty=format:'%Cred%h%Creset -%C(gelb)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Für diesen Befehl kann auch ein Alias gesetzt werden, via git config --global alias.logline „log -graph ...“

Git-Log mit benutzerdefinierter Formatierung
Git-Log mit benutzerdefinierter Formatierung

Einen Branch mit interaktivem Rebase aufräumen

Git's interaktiver Rebase kann verwendet werden, um die Commit-Historie zu bearbeiten, indem man Commits kombiniert, Commit-Messages bearbeitet oder einige von ihnen verwirft. Das ist praktisch, wenn man z.B. einen Feature-Branch vor dem Mergen aufräumen will. git rebase -i öffnet eine Liste von Commits in einem Editor, wo man den Standardbefehl „pick“ in einen passenden Befehl ändern kann. Eine detaillierte Beschreibung gibt es hier.

Mit git bisect auf Fehlersuche gehen 

Stell dir folgendes Szenario vor: Der Code funktioniert nicht richtig, aber man kommt nicht drauf, woran es liegt. Vor einer Woche lief noch alles einwandfrei.

Git bisect kann helfen, den genauen Commit zu bestimmen, an dem ein Fehler eingeführt wurde. Man führt git bisect start aus und markiert die guten und schlechten Commits (mit git bisect good / git bisect bad <hash>), d.h. die Commits von denen man weiß dass der Code funktioniert bzw nicht funktioniert. Git wechselt dann automatisch zu dem Commit in der Mitte. Man kann ihn als gut oder schlecht markieren und Git wechselt dann wieder zum Commit in der Mitte zwischen den guten und schlechten Commits. Dieser Vorgang wird wiederholt, bis der schuldige Commit gefunden wurde.

Ausgehend von einem schlechten (Schritt 1) und einem guten (Schritt 2) Commit, springt git bisect zu den Commits dazwischen (Schritte 3 und 4), um den Commit einzugrenzen, bei dem ein Fehler eingeführt wurde (Schritt 5)
Ausgehend von einem schlechten (Schritt 1) und einem guten (Schritt 2) Commit, springt git bisect zu den Commits dazwischen (Schritte 3 und 4), um den Commit einzugrenzen, bei dem ein Fehler eingeführt wurde (Schritt 5)

Verlorenes mit git reflog wiederfinden

Versehentlich wurde ein Branch gelöscht oder ein Commit verloren? Keine Sorge, die sind noch in Git vorhanden! Man kann git reflog verwenden, um eine Liste der vorherigen Commits/Branches, an denen man gearbeitet hat, zu erhalten und den Hash des gelöschten Objekts zu finden (um es mit git checkout wiederherzustellen):

Liste der vorherigen Commits/Branches
Liste der vorherigen Commits/Branches

Wechseln zu einem anderen Branch mit git worktree

Angenommen, man arbeiten an einem neuen Feature und hat viele bearbeitete oder neue Dateien. Plötzlich muss man etwas Dringliches auf dem Main-Branch fixen. Normalerweise würden man entweder die Änderungen committen und in den Main-Branch wechseln oder eine neue Kopie des gesamten Repositories in einem neuen Verzeichnis erstellen, um einen sauberen Zustand zu haben.

Mit git worktree kann man einen weiteren Worktree erstellen, so etwas wie „eine Kopie des Repositories innerhalb des Repositoriess“, die man löschen kann, nachdem man Änderungen vorgenommen hat:

git worktree add ./fix-critical-bug main
# Wechseln in das Verzeichnis „fix-critical-bug“, Bug fixen und Commit auf Main-Branch pushen

git worktree remove ./fix-critical-bug

# zurück zur Arbeit am neuen Feature


Zusammenfassend lässt sich sagen, dass man durch die Integration dieser modernen Befehlszeilentools und fortgeschrittenen Git-Befehle im Arbeitsablauf die Produktivität steigern und effizienter Software mit echtem Business-Value entwickeln kann.

Möchtest du Teil des Teams werden?

16 Personen gefällt das

0Noch keine Kommentare

Dein Kommentar
Antwort auf:  Direkt auf das Thema antworten

Geschrieben von

Dominik Haitz
Dominik Haitz
Senior Data Scientist

Ähnliche Beiträge

We want to improve out content with your feedback.

How interesting is this blogpost?

We have received your feedback.

Cookies erlauben?

OTTO und drei Partner brauchen deine Einwilligung (Klick auf "OK") bei einzelnen Datennutzungen, um Informationen auf einem Gerät zu speichern und/oder abzurufen (IP-Adresse, Nutzer-ID, Browser-Informationen).
Die Datennutzung erfolgt für personalisierte Anzeigen und Inhalte, Anzeigen- und Inhaltsmessungen sowie um Erkenntnisse über Zielgruppen und Produktentwicklungen zu gewinnen. Mehr Infos zur Einwilligung gibt’s jederzeit hier. Mit Klick auf den Link "Cookies ablehnen" kannst du deine Einwilligung jederzeit ablehnen.

Datennutzungen

OTTO arbeitet mit Partnern zusammen, die von deinem Endgerät abgerufene Daten (Trackingdaten) auch zu eigenen Zwecken (z.B. Profilbildungen) / zu Zwecken Dritter verarbeiten. Vor diesem Hintergrund erfordert nicht nur die Erhebung der Trackingdaten, sondern auch deren Weiterverarbeitung durch diese Anbieter einer Einwilligung. Die Trackingdaten werden erst dann erhoben, wenn du auf den in dem Banner auf otto.de wiedergebenden Button „OK” klickst. Bei den Partnern handelt es sich um die folgenden Unternehmen:
Google Ireland Limited, Meta Platforms Ireland Limited, LinkedIn Ireland Unlimited Company
Weitere Informationen zu den Datenverarbeitungen durch diese Partner findest du in der Datenschutzerklärung auf otto.de/jobs. Die Informationen sind außerdem über einen Link in dem Banner abrufbar.
Du kannst deine Einwilligung auch jederzeit grundlos mit Wirkung für die Zukunft widerrufen, indem du auf den Button "Cookie-Einstellungen" im Footer der Website und "Cookies ablehnen" klickst.