Zum Inhalt springen →

Magie mit der git bash

Git ist eine freie Software zur verteilten Versionsverwaltung von Dateien, die mittlerweile jeder kennen sollte, daher verliere ich hier nicht viele Worte darüber. Wer die wichtigsten git Befehle wie „git add“, „git commit“ und „git push“ nicht kennt ist hier total falsch. Sorry, aber Du solltest erst mal hier anfangen.

Natürlich kann man git auch ohne die git bash verwenden. Jede IDE, die etwas auf sich hält hat eine Git Integration und darüber hinaus gibt es z.B. weitere Tools, wie TortoiseGit, SourceTree, GitKraken, Tower, etc.
Alle diese Git-Clients haben ihre Daseinsberechtigung und sind sehr gut geeignet, das Tippen in der Konsole durch Mausklicks auf Klickibunti-Oberflächen mehr oder weniger gut zu ersetzen. Bist Du also ein Fan von Klickibunti, dann kannst du jetzt den Browser-Tab schließen (PS: Dafür gibt es auch einen Keyboard Shortcut, falls Du doch mal die Tastatur verwenden möchtest „Ctrl-W“ ). 🙂

Du hast es also bis hierhin geschafft. Daher gehe ich davon aus, dass Du ein Fenster wie dieses hier den ganzen Tag offen hast.

PS: Der dezente Liebesgruß kommt aus meiner „.bashrc“ Datei in meinem $HOME Verzeichnis liegt und folgenden Inhalt hat.

#!/bin/sh

echo -e '     ____   __  __           _ __     __               __   '
echo -e '    /  _/  /  \/  \   ____ _(_) /_   / /_  ____ ______/ /_  '
echo -e '    / /    \      /  / __ `/ / __/  / __ \/ __ `/ ___/ __ \ '
echo -e '  _/ /      \    /  / /_/ / / /_   / /_/ / /_/ (__  ) / / / '
echo -e ' /___/       \  /   \__, /_/\__/  /_.___/\__,_/____/_/ /_/  '
echo -e '              \/   /____/                                   '

Damit erfreut man Kollegen, wenn sie mal wieder mit ihrem Klickibunti git Client nicht weiter kommen. 🙂

Was kann die git bash denn nun?

Um auf diese Frage qualifiziert zu antworten reicht ein einfacher Blog Post nicht, aber zusammenfassend kann man sagen: Sehr sehr sehr viel.

Die git bash bietet eine BASH-Emulation, mit der Git von der Kommandozeile aus ausgeführt werden kann. UNIX/Linux -Benutzer werden sich (fast) wie zu Hause fühlen, da sich die BASH-Emulation wie der Befehl „git“ in LINUX- und UNIX-Umgebungen verhält.
Zum Starten einer git bash klickt man einfach mit der rechten Maustaste auf einen Ordner im Windows Explorer und schon kann man im Kontextmenü mit einem klick auf „Git Bash here“ die git bash im ausgewälten Ordner öffnen.

Nun kann die Magie beginnen

Neben dem Befehl „git“ enthält die git bash noch eine Reihe anderer Befehle wie z.B. „cd“ mit dem man das Verzeichnis wechseln kann oder „ls“ mit dem man sich Dateien auflisten lassen kann. Aber das ist noch lange nicht alles. So kann man z.B. mit dem Befehl „which“ nachsehen in welchem Verzeichnis die ausführbare Datei zu einem Befehl zu finden ist.

So kann man mit dem Befehl

$ which ls

prüfen, wo sich die Datei „ls“ befindet. Das Ergebnis ist für einen Linux/UNIX Nutzer nicht weiter überraschend.

 /usr/bin/ls

Sehr schön. Was ist denn sonst noch so unter /usr/bin installiert? Das kann man einfach herausfinden, indem man „ls /usr/bin“ auf der Konsole tippt.

$ ls /usr/bin
 '[.exe'*                         msys-pcre-1.dll*
  arch.exe*                       msys-perl5_24.dll*
  astextplain*                    msys-readline7.dll*
  autopoint*                      msys-roken-18.dll*
  awk.exe*                        msys-sasl2-3.dll*
  b2sum.exe*                      msys-serf-1-0.dll*
  backup*                         msys-sl-0.dll*
  base32.exe*                     msys-smartcols-1.dll*
  base64.exe*                     msys-sqlite3-0.dll*
  basename.exe*                   msys-sqlite3amatch-0.dll*
  bash.exe*                       msys-sqlite3carray-0.dll*
  bashbug*                        msys-sqlite3closure-0.dll*
  bunzip2.exe*                    msys-sqlite3compress-0.dll*
  bzcat.exe*                      msys-sqlite3csv-0.dll*
  bzcmp*                          msys-sqlite3eval-0.dll*
  bzdiff*                         msys-sqlite3fileio-0.dll*
  bzegrep*                        msys-sqlite3fuzzer-0.dll*
  bzfgrep*                        msys-sqlite3icu-0.dll*
  bzgrep*                         msys-sqlite3ieee754-0.dll*
  bzip2.exe*                      msys-sqlite3memvfs-0.dll*
  bzip2recover.exe*               msys-sqlite3nextchar-0.dll*
  bzless*                         msys-sqlite3percentile-0.dll*
  bzmore*                         msys-sqlite3rbu-0.dll*
  c_rehash*                       msys-sqlite3regexp-0.dll*
  captoinfo.exe*                  msys-sqlite3remember-0.dll*
  cat.exe*                        msys-sqlite3rot13-0.dll*
  chcon.exe*                      msys-sqlite3series-0.dll*
  chgrp.exe*                      msys-sqlite3sha1-0.dll*
  chmod.exe*                      msys-sqlite3showauth-0.dll*
  chown.exe*                      msys-sqlite3spellfix-0.dll*
  chroot.exe*                     msys-sqlite3totype-0.dll*
  cksum.exe*                      msys-sqlite3vfslog-0.dll*
  clear.exe*                      msys-sqlite3vfsstat-0.dll*
  cmp.exe*                        msys-sqlite3vtshim-0.dll*
  column.exe*                     msys-sqlite3wholenumber-0.dll*
  comm.exe*                       msys-ssh2-1.dll*
  core_perl/                      msys-ssl-1.0.0.dll*
  cp.exe*                         msys-ssp-0.dll*
  csplit.exe*                     msys-svn_client-1-0.dll*
  cut.exe*                        msys-svn_delta-1-0.dll*
  cygcheck.exe*                   msys-svn_diff-1-0.dll*
  cygpath.exe*                    msys-svn_fs-1-0.dll*
  cygwin-console-helper.exe*      msys-svn_fs_fs-1-0.dll*
  d2u.exe*                        msys-svn_fs_util-1-0.dll*
  dash.exe*                       msys-svn_fs_x-1-0.dll*
  date.exe*                       msys-svn_ra-1-0.dll*
  dd.exe*                         msys-svn_ra_local-1-0.dll*
  df.exe*                         msys-svn_ra_serf-1-0.dll*
  diff.exe*                       msys-svn_ra_svn-1-0.dll*
  diff3.exe*                      msys-svn_repos-1-0.dll*
  dir.exe*                        msys-svn_subr-1-0.dll*
  dircolors.exe*                  msys-svn_swig_perl-1-0.dll*
  dirname.exe*                    msys-svn_swig_py-1-0.dll*
  docx2txt*                       msys-svn_swig_ruby-1-0.dll*
  docx2txt.pl*                    msys-svn_wc-1-0.dll*
  dos2unix.exe*                   msys-tasn1-6.dll*
  du.exe*                         msys-ticw6.dll*
  echo.exe*                       msys-uuid-1.dll*
  egrep*                          msys-wind-0.dll*
  env.exe*                        msys-xml2-2.dll*
  envsubst.exe*                   msys-z.dll*
  ex.exe*                         mv.exe*
  expand.exe*                     ngettext.exe*
  expr.exe*                       nice.exe*
  factor.exe*                     nl.exe*
  false.exe*                      nohup.exe*
  fgrep*                          notepad*
  file.exe*                       nproc.exe*
  find.exe*                       numfmt.exe*
  findssl.sh*                     od.exe*
  fmt.exe*                        openssl.exe*
  fold.exe*                       p11-kit.exe*
  funzip.exe*                     passwd.exe*
  gawk-4.1.4.exe*                 paste.exe*
  gawk.exe*                       patch.exe*
  gdbm_dump.exe*                  pathchk.exe*
  gdbm_load.exe*                  perl.exe*
  gdbmtool.exe*                   perl5.24.1.exe*
  getconf.exe*                    pinky.exe*
  getfacl.exe*                    pldd.exe*
  getopt.exe*                     pluginviewer.exe*
  gettext.exe*                    pr.exe*
  gettext.sh*                     printenv.exe*
  gettextize*                     printf.exe*
  git-flow*                       ps.exe*
  git-flow-bugfix                 ptx.exe*
  git-flow-config                 pwd.exe*
  git-flow-feature                readlink.exe*
  git-flow-hotfix                 realpath.exe*
  git-flow-init                   rebase.exe*
  git-flow-log                    rebaseall*
  git-flow-release                recode-sr-latin.exe*
  git-flow-support                regtool.exe*
  git-flow-version                reset.exe*
  gitflow-common                  restore*
  gitflow-shFlags                 rm.exe*
  gkill.exe*                      rmdir.exe*
  gpg-zip*                        runcon.exe*
  gpg.exe*                        rview.exe*
  gpgsplit.exe*                   rvim.exe*
  gpgv.exe*                       sasldblistusers2.exe*
  grep.exe*                       saslpasswd2.exe*
  groups.exe*                     scp.exe*
  gunzip*                         sdiff.exe*
  gzexe*                          sed.exe*
  gzip.exe*                       seq.exe*
  head.exe*                       setfacl.exe*
  hostid.exe*                     setmetamode.exe*
  hostname.exe*                   sftp.exe*
  iconv.exe*                      sh.exe*
  id.exe*                         sha1sum.exe*
  igawk*                          sha224sum.exe*
  infocmp.exe*                    sha256sum.exe*
  infotocap.exe*                  sha384sum.exe*
  install.exe*                    sha512sum.exe*
  join.exe*                       shred.exe*
  kill.exe*                       shuf.exe*
  ldd.exe*                        sleep.exe*
  ldh.exe*                        sort.exe*
  less.exe*                       split.exe*
  lessecho.exe*                   ssh-add.exe*
  lesskey.exe*                    ssh-agent.exe*
  link.exe*                       ssh-copy-id*
  ln.exe*                         ssh-keygen.exe*
  locale.exe*                     ssh-keyscan.exe*
  locate.exe*                     ssh-pageant.exe*
  logname.exe*                    ssh.exe*
  ls.exe*                         sshd.exe*
  mac2unix.exe*                   ssp.exe*
  md5sum.exe*                     start*
  minidumper.exe*                 stat.exe*
  mintty.exe*                     stdbuf.exe*
  mkdir.exe*                      strace.exe*
  mkfifo.exe*                     stty.exe*
  mkgroup.exe*                    sum.exe*
  mknod.exe*                      sync.exe*
  mkpasswd.exe*                   tabs.exe*
  mktemp.exe*                     tac.exe*
  mount.exe*                      tail.exe*
  msgattrib.exe*                  tar.exe*
  msgcat.exe*                     tee.exe*
  msgcmp.exe*                     test.exe*
  msgcomm.exe*                    tic.exe*
  msgconv.exe*                    timeout.exe*
  msgen.exe*                      toe.exe*
  msgexec.exe*                    touch.exe*
  msgfilter.exe*                  tput.exe*
  msgfmt.exe*                     tr.exe*
  msggrep.exe*                    true.exe*
  msginit.exe*                    truncate.exe*
  msgmerge.exe*                   trust.exe*
  msgunfmt.exe*                   tset.exe*
  msguniq.exe*                    tsort.exe*
  msys-2.0.dll*                   tty.exe*
  msys-apr-1-0.dll*               tzset.exe*
  msys-aprutil-1-0.dll*           u2d.exe*
  msys-asn1-8.dll*                umount.exe*
  msys-asprintf-0.dll*            uname.exe*
  msys-atomic-1.dll*              uncompress*
  msys-blkid-1.dll*               unexpand.exe*
  msys-bz2-1.dll*                 uniq.exe*
  msys-charset-1.dll*             unix2dos.exe*
  msys-cilkrts-5.dll*             unix2mac.exe*
  msys-com_err-1.dll*             unlink.exe*
  msys-crypt-0.dll*               unzip.exe*
  msys-crypto-1.0.0.dll*          unzipsfx.exe*
  msys-curl-4.dll*                update-ca-trust*
  msys-edit-0.dll*                updatedb*
  msys-expat-1.dll*               users.exe*
  msys-fdisk-1.dll*               vdir.exe*
  msys-ffi-6.dll*                 vendor_perl/
  msys-formw6.dll*                vi*
  msys-gcc_s-seh-1.dll*           view.exe*
  msys-gdbm-4.dll*                vim.exe*
  msys-gdbm_compat-4.dll*         vimdiff.exe*
  msys-gettextlib-0-19-8-1.dll*   vimtutor*
  msys-gettextpo-0.dll*           wc.exe*
  msys-gettextsrc-0-19-8-1.dll*   which.exe*
  msys-gmp-10.dll*                who.exe*
  msys-gmpxx-4.dll*               whoami.exe*
  msys-gomp-1.dll*                winpty-agent.exe*
  msys-gssapi-3.dll*              winpty-debugserver.exe*
  msys-hdb-9.dll*                 winpty.dll*
  msys-heimbase-1.dll*            winpty.exe*
  msys-heimntlm-0.dll*            wordpad*
  msys-history7.dll*              xargs.exe*
  msys-hx509-5.dll*               xgettext.exe*
  msys-iconv-2.dll*               xmlcatalog.exe*
  msys-idn-11.dll*                xmllint.exe*
  msys-intl-8.dll*                xmlwf.exe*
  msys-kadm5clnt-7.dll*           xxd.exe*
  msys-kadm5srv-8.dll*            yes.exe*
  msys-kafs-0.dll*                zcat*
  msys-kdc-2.dll*                 zcmp*
  msys-krb5-26.dll*               zdiff*
  msys-lzma-5.dll*                zegrep*
  msys-magic-1.dll*               zfgrep*
  msys-menuw6.dll*                zforce*
  msys-metalink-3.dll*            zgrep*
  msys-mpfr-4.dll*                zipgrep*
  msys-ncurses++w6.dll*           zipinfo.exe*
  msys-ncursesw6.dll*             zless*
  msys-otp-0.dll*                 zmore*
  msys-p11-kit-0.dll*             znew*
  msys-panelw6.dll*

Wow, das ist ja eine ganze Menge. Um herauszufinden wie viele Befehle es sind, kann man die Befehle mit dem Aufruf von „find /usr/bin -type f | wc -l“ zählen. Das Ergebnis ist:

$ find /usr/bin -type f | wc -l
 444

Satte 444 Dateien. OK, nicht jede Datei ist ein Befehl, also noch mal nur die Dateien, die auf „.exe“ enden.

$ find /usr/bin -type f | grep ".exe" | wc -l
 237

Das sind noch immer über 230 ausführbare Dateien, die man sich mit der git bash auf den Computer geholt hat. Da sollte doch mehr möglich sein als nur der Befehl „git“ – oder?

Top-10 Befehle der git bash

Statt sich alle 237 Befehle der git Bash in detail anzusehen lohnt es sich mal vorzufiltern. Was sind also die Top-10 Befehle der git bash? …..

Jeder mag hier seine persönlichen Top-10 aufstellen, aber es gibt ein paar Befehle, die ich eigentlich jeden Tag benutze und die ich in diversen kleinen Skripten verwende, die mir jeden Tag viel Arbeit abnehmen und Fehler vermeiden.

awk.exe bash.exe cat.exe chmod.exe cp.exe date.exe echo.exe find.exe grep.exe gzip.exe head.exe hostname.exe kill.exe less.exe ls.exe mkdir.exe mv.exe nohup.exe pwd.exe rm.exe scp.exe sed.exe sftp.exe sh.exe sleep.exe sort.exe ssh.exe tail.exe tar.exe touch.exe tr.exe unzip.exe vim.exe wc.exe which.exe xargs.exe

OK, ok. Es sind keine 10. Aber was soll ich machen? Das sind einfach alles sooooooooooooooo tolle Befehle und eine Überschrift wie z.B. „Top-36 Befehle der git bash“ wirkt eher abschreckend und ist SEO-technisch bestimmt auch eine mittelschwere Katastrophe. Also bleibe ich bei den Top 10. Wem das nicht passt „Ctrl-W“ hilft!

Wer sich nun fragt, wie ich die Dateien so schnell zusammengedapft habe? Ganz einfach mit den Tools der git-Bash.

  1. Befehle auflisten und in eine Textdatei schreiben
    find /usr/bin -type f | grep „.exe“ > befehle.txt
  2. Datei im vim öffnen
    vim befehle.txt
  3. Jeder Befehl kann nun mit einem „dd“ im Kommando-Modus gelöscht werden (Eine Sehr ausführliche „Kurzeinführung in vim findet man unter https://www-user.tu-chemnitz.de/~hot/VIM/VIM/vikurz.html)
  4. Dann in jeder Zeile den Präfix “ /usr/bin/“ entfernen. Das geht z.B. so:
    :%s/^.*\///g
    Das ist keine Magie, das sind nur reguläre Ausdrücke. Die machen Spaß, wenn man sie versteht. Anderenfalls bekommt man davon leider Haarausfall
  5. Nun noch alle Zeilen zu einer Zeile zusammenfassen.
    JJJJJJJJJJ…
    Statt x-mal J zu drücken kann man auch „J“ ein wenig gedrückt halten.

Damit ist auch schon einer der wichtigsten Befehle der Git-Bash erklärt. Der vim ist ein Texteditor. Er ist sehr mächtig und wer in einmal beherrscht möchte nie wieder einen anderen Editor haben. Genau aus dem Grund gibt es auch vi-Plugins für Eclipse, Visual-Studio-Code, IntelliJ, etc.

Da viele der oben genannten Befehle ähnlich wie der vim-Editor sehr umfangreich sind beschränke ich mich nun auf 1-2 Sätze pro Befehl und verlikne dann ein passendes Manual.

Die Auflistung der Befehle wird den Funktionen und Möglichkeiten der einzelnen Kommandos leider nicht ganz gerecht. Viele der Befehle sind so mächtig, dass selbst Yoda sich vor ihnen verstecken würde. Daher kann ich jedem, nur empfehlen, sich mal intensiver mit dem Thema zu befassen.

Einer der Gründe, warum die git bash immer eines der ersten Pakete ist, die ich auf einem neue aufgesetzten Windows PC installiere, ist die die Tatsache, dass ich dank der git Bash das Beste aus beiden Welten bekomme. Linux ist nun mal leider in den meisten Unternehmen keine Option und ohne grep und awk würde ich keine 5 Minuten als Software-Entwickler überlegen.

Gibt es da nicht noch mehr?

Klar gibt es da noch mehr. Wer den has nicht voll kriegen kann sollte mal Cygwin ausprobieren. Mit Cygwin lassen sich Computerprogramme, aus der Linux Welt unter Windows ausführen. Die Anzahl der verfügbaren Programme ist schier endlos und was fehlt, kann dank verfügbarem gcc einfach selber compiliert werden. Allerdings ist Cgwin nicht gerade für den Einsteiger geeignet und eher für Nutzer mit einiger Linux/Unix Erfahrung geeignet. Eine vollständige Liste aller verfügbaren Pakete findet man unter https://cygwin.com/packages/package_list.html.

Das Baukastenprinzip

Die grundlegende Philosophie der Unix-Kommandos ist das Baukasten-Prinzip: Statt der eierlegenden Wollmilchsau für einzelne Aufgabengebiete werden spezialisierte Befehle für elementare Aufgaben bereitgestellt, die miteinander verknüpft werden können, um komplexere Aktionen durchzuführen.
Die meisten Befehle kennen drei Standardkommunikationswege in für die Verknüpfung untereinander verwendet werden können:

  • Standardeingabe (stdin)
    Daten in ein Programm einlesen. Ist normalerweise mit der Tastatur verbunden
  • Standardausgabe (stdout)
    Daten ausgeben. Ist normalerweise mit dem Monitor verbunden.
  • Standardfehlerausgabe (stderr)
    Diagnose- und Fehlermeldungen oder Warnungen ausgegeben.

Ausgaben von Programmen die nach stdout oder stderr ausgegeben werden, können aber auch in eine Datei geschrieben werden oder als Eingabe (stdin) für folgende Programme fungieren.
Der Befehl mit dem ich weiter oben die Liste erstellt habe ist ein gutes Beispiel dafür:

find /usr/bin -type f | grep “.exe” > befehle.txt

Hier wird der Befehl find aufgerufen und die Ausgabe (stdout) mit dem Pipe Zeichen „|“ als Eingabe für den Befehl grep durchgereicht. Die Ausgaben von grep wiederum werden nicht auf dem Montor ausgegeben sondern mit „> DATEINAME“ in eine Datei umgeleitet.
Das entspricht genau der grundlegenden Philosophie der Linux/Unix Welt, kleine Bausteine miteinander zu verknüpfen um Aufgeben möglichst effizient zu lösen.

Fazit

Nachdem ich nun einen fast 20000 Zeichen langen Text verfasst habe versuche ich mich also noch mal daran zu erinnern, was eigenltich der Grundgedanke hinter dem Blog-Post war…….

Ach ja. Die git bash hat mehr zu bieten, als nur „git add“, „git commit“ und „git push“. Wie viel das ist und was davon sinnvoll eingesetzt werden kann muss jeder für sich selbst herausfinden.

Veröffentlicht in Allgemein