Aliase in Git

Blog thumbnail

Aliase sind ein super unterschätztes Feature von Git. Ich kenne kaum Leute, die Aliase wirklich nutzen. Meiner Meinung nach entgeht einem was, denn mit Aliasen kann man sich seinen eigenen Workflow bauen und sich viel Tipperei ersparen. Aliase sind am ehesten ein Meta-Feature, mit dem man sich seine eigenen Features basteln kann.

Meine Aliase

Hier sind die Aliase aufgelistet, die ich mir definiert habe

co = checkout
ma = git co master
cm = commit
amend = !git commit --amend -m \"$(git log --format=%B -n1)\"
st = status
br = branch
nb = co -b
bc = rev-parse --abbrev-ref HEAD
ps = push
fp = push --force-with-lease
fpull = !(git reset --hard \"origin/$(git bc)\")
sync = fetch -p
rb = rebase
rc = rb --continue
ra = rb --abort
ri = rb -i
lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset)
%C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)-%an%C(reset)' --all
ax = log -S
unstage = reset HEAD --
tidy = !git ri \"$(git merge-base HEAD master)\"
remaster = ri master
redev = ri develop
dad = !curl https://icanhazdadjoke.com/ && echo && git add

Einen Alias erstellen

Es gibt zwei Möglichkeiten, um einen Alias zu erstellen. Angenommen wir wollen, dass wir anstatt git status nur noch git st schreiben müssen.

1. Direktes Eintragen in die Config

Mit seinem Lieblings-Texteditor öffnet man im Home-Verzeichnis die Datei ~/.gitconfig und trägt unter [alias] den neuen Alias ein. Falls die Sektion [alias] noch nicht existiert muss man sie erstellen.

[alias]
st = status

2. Per Git Command

Man öffnet das Terminal und gibt ein

git config --global alias.st status

Abkürzungen

Ein offensichtlicher Vorteil von Aliasen ist, dass man sich seine eigenen Abkürzungen für häufig genutzte Commands geben kann.

co = checkout
ma = git co master
cm = commit
st = status
br = branch
ps = push
rb = rebase
rc = rb --continue
ra = rb --abort
ri = rb -i

Die meisten hiervon sind klar. Ich nutze git rebase sehr oft deshalb sind viele Aliase für Rebase dabei. Man kann Aliase in anderen Aliasen verwenden.

rc = rb --continue // = rebase --continue

Command Line Aliases

Manchmal reichen so simple Aliase nicht aus, um den Effekt zu erreichen, den man haben möchte. Man einem vorangestellten “!” kann man auch Bash- bzw. Konsolenbefehle per Git Alias ausführen.

Ein Gruß von Git

git config --global alias.hallo "!(echo Hallo Git)"
git hallo
=> Hallo Git

Mit solchen Commands kann man deutlich komplexere Abläufe abbilden.

Schneller Amend

amend = !git commit --amend -m \"$(git log --format=%B -n1)\"

Einer der besten Aliases, die jemals erfunden wurden! Es passiert mir super oft, dass ich dem letzten Commit noch etwas hinzufügen will, aber der Titel des Commit total in Ordnung ist. Normalerweise müsste ich git cm --amend eingeben und dann noch mal im Text Editor den Titel absegnen, was in vielen Fällen unnötig ist. Was ich will ist also so etwas wie git cm --amend -m "Titel des letzten Commits" und das ist genau, was das folgende Command uns gibt:

git log --format=%B -n1

Die Option --format=%B sagt Git, dass wir nur den Titel wollen; die Option -n1 , dass wir nur den letzten Commit sehen möchten.

Scherz gefällig?

Ein weiterer sehr guter Alias ist git dad.

dad = !curl https://icanhazdadjoke.com/ && echo && git add

Macht dasselbe, wie git add , aber spuckt vorher noch einen Dad-Joke aus. Nutzung auf eigene Gefahr, sie sind wirklich seeeehr schlecht!

Seinen Branch aufräumen

Der nächste Alias ist schwierig zu verstehen, wenn man selten mit Rebase arbeitet. Angenommen man arbeitet an einem Feature und in der Zwischenzeit ist viel auf master passiert. Jetzt möchte man seinen Feature-Branch aufräumen und tut das am liebsten über rebase --interactive . Das Problem ist, dass man auf einen anderen Commit bzw. Branch rebasen muss, aber man hat noch keinen Nerv, die Änderungen auf master bei sich mit einzupflegen.

Was man eigentlich möchte ist, dass man auf den Commit rebased bei dem man angefangen hat sich vom master Branch zu distanzieren. Im wesentlichen auf die Wurzel seines eigenen Astes. Zum Glück ist merge-base genau der Befehl mit dem man für zwei gegebene Commits die gemeinsame Wurzel bestimmen kann. Wir wollen also merge-base mit dem Commit auf dem wir gerade sind (HEAD ) und unserem Hauptbranch master ausführen und dann einen interaktiven Rebase auf das Ergebnis machen.

tidy = !git ri \"$(git merge-base HEAD master)\"

Force Pull

Ähnlich wie man mit einem force push einen Branch im Remote Repository überschreiben kann, möchte ich ab und zu auch meinen lokalen Branch auf den Stand des dazugehörigen Remote Branches setzen. Man kann Branches beliebig versetzen indem man git reset --hard <commit> ausführt. Da das Remote Repository normalerweise origin heißt, würde der Remote Branch unter dem Namen origin/<branch> zu finden sein.

Als Hilfsalias definieren wir

bc = rev-parse --abbrev-ref HEAD

um den Namen unseres aktuellen Branches zu bekommen. Danach können wir den Force Pull definieren.

fpull = !(git reset --hard \"$(git bc)\")

Weitere Convenience-Aliase

Es gibt noch ein paar Aliase, die nicht direkt Abkürzungen sind, aber beispielsweise gewisse Optionen per Default setzen. Auch damit kann man viel machen.

Schöner Graph mit Git Log

lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)-%an%C(reset)' --all

Ein schön formattierter Git Graph, der die Commits zueinander in Relation setzt. Einer meiner häufigsten genutzten Aliase. Die konkrete Farbgebung habe ich aus einem Blogpost geklaut, den ich leider nicht mehr finde. Es gibt aber viele andere, die versuchen den Log ein wenig aufzuwerten.

Die Spitzhacke

Bennant nach der Spitzhacke. git log -S "!important;" zeigt alle Commits bei denen sich die Anzahl der Zeilen, in denen “!important;” vorkommt, geändert hat. Gut geeignet als Vorstufe zu git blame .

ax = log -S

Wenn man also im Code auf eine Zeile stößt, die man nicht versteht bzw. die einem seltsam vorkommt kann man sich einen Substring rauspicken und dann per git ax <string> danach suchen. Wenn man direkt die Änderungen der Commits mitgeliefert bekommen möchte kann man die Patch-Option (-p) hinzufügen.

ax = log -S -p

Änderungen aus der Stage kicken

unstage = reset HEAD --

Das Gegenteil von git add . . Nimmt alle Dateien wieder aus der Staging-Area raus.

Remote Repo synchronisieren

sync = fetch -p

Schau dir den Zustand des remote Repos an (fetch ) und lösche alte Branches (-p ).

Direkt zu neuem Branch wechseln

nb = co -b

Abkürzung für checkout -b . git nb \<branch\> erstellt einen neuen Branch und wechselt direkt hin.

Force Push, aber sicher(er)

fp = push --force-with-lease

Perfekter Alias, denn fp klingt nach Force Push, hat aber die weniger gefährliche Option force-with-lease vorgegeben, über die ich noch separat etwas schreiben werde.