95 Punkte von xguru 2025-02-26 | 7 Kommentare | Auf WhatsApp teilen
  • Scott Chacon, Autor von "Pro Git", erklärt einige Git-Einstellungen, die er global aktiviert hat, und warum
  • Viele dieser Einstellungen hat er tatsächlich von Entwicklern übernommen, die an der Git-Core-Codebasis arbeiten
  • Unten stehen ~/.gitconfig-Einstellungen, die Git besser machen
    [column]  
    ui = auto  
    [branch]  
    sort = -committerdate  
    [tag]  
    sort = version:refname  
    [init]  
    defaultBranch = main  
    [diff]  
    algorithm = histogram  
    colorMoved = plain  
    mnemonicPrefix = true  
    renames = true  
    [push]  
    default = simple  
    autoSetupRemote = true  
    followTags = true  
    [fetch]  
    prune = true  
    pruneTags = true  
    all = true  
    
    # Warum eigentlich nicht?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # Einstellungen nach persönlichem Geschmack (bei Bedarf auskommentieren und verwenden)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (bei Git-Versionen kleiner als 2.3 `diff3` verwenden)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Wie konfigurieren Git-Core-Entwickler Git?

  • In der Git-Mailingliste hatte Felipe Contreras dem Core-Team einmal vorgeschlagen, alle Einstellungen und Aliasse zu entfernen und Git in der Standardkonfiguration zu verwenden
  • Als Ergebnis dieses Experiments wurden 9 Einstellungen und 3 Aliasse als neue Standardwerte vorgeschlagen
    merge.conflictstyle = zdiff3  
    rebase.autosquash = true  
    rebase.autostash = true   
    commit.verbose = true  
    diff.colorMoved = true  
    diff.algorithm = histogram  
    grep.patternType = perl  
    feature.experimental = true  
    branch.sort = committerdate  
    
  • Diese Einstellungen wurden noch nicht als Standardwerte übernommen
  • Interessant ist aber, dass viele Git-Entwickler Git nur schwer nutzen können, wenn einige davon nicht aktiviert sind
  • Noch interessanter ist, dass die meisten von euch vermutlich gar nicht wissen, was das alles bedeutet
  • Die Erklärung ist in drei Kategorien aufgeteilt
    • Was Git eindeutig besser macht (Clearly Makes Git Better)
    • Warum zur Hölle nicht? (Why the Hell Not?)
    • Geschmackssache (A Matter of Taste)

# Was Git eindeutig besser macht

Branch-Liste sortieren

  • Standardmäßig sortiert Git Branches alphabetisch, aber eine Sortierung nach dem Datum des letzten Commits kann nützlicher sein
  • Mit den folgenden Einstellungen werden Branches nach dem jüngsten Commit sortiert und in Spalten dargestellt
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

Tag-Liste sortieren

  • Um Tags nicht alphabetisch, sondern nach Version zu sortieren, verwende die folgende Einstellung
    git config --global tag.sort version:refname  
    

Standard-Branch-Namen festlegen

  • Um beim Initialisieren neuer Repositories den Standard-Branch-Namen festzulegen, verwende
    git config --global init.defaultBranch main  
    

Verbesserte diff-Einstellungen

  • Der Standard-diff-Algorithmus wird auf histogram geändert, um präzisere Vergleiche zu ermöglichen
  • Um Codeverschiebungen zu erkennen und farblich hervorzuheben, füge folgende Einstellungen hinzu
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

Verbesserte push-Einstellungen

  • Mit den folgenden Einstellungen lässt sich das Verhalten von push verbessern
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

Verbesserte fetch-Einstellungen

  • Um beim fetch unnötige Branches und Tags automatisch zu entfernen, verwende folgende Einstellungen
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# Warum eigentlich nicht?

Autokorrektur mit Rückfrage

  • Um Tippfehler bei der Eingabe von Befehlen zu erkennen und Vorschläge zu machen, verwende
    git config --global help.autocorrect prompt  
    

diff beim Committen

  • Um beim Schreiben der Commit-Nachricht auch die Änderungen anzuzeigen, füge folgende Einstellung hinzu
    git config --global commit.verbose true  
    

Konfliktauflösungen wiederverwenden

  • Um frühere Konfliktauflösungen automatisch wiederzuverwenden, verwende folgende Einstellungen
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

Globale .gitignore-Datei festlegen

  • Um Dateien festzulegen, die global ignoriert werden sollen, verwende
    git config --global core.excludesfile ~/.gitignore  
    

Rebase-Einstellungen verbessern

  • Um bei einem Rebase automatisch Squash und Stash zu verwenden, nutze folgende Einstellungen
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# Geschmackssache

Verbesserte Anzeige von Merge-Konflikten

  • Um bei Merge-Konflikten zusätzlich die gemeinsame Basisversion anzuzeigen, ziehe folgende Einstellung in Betracht
    git config --global merge.conflictstyle zdiff3  
    

Rebase bei pull verwenden

  • Um bei git pull automatisch ein Rebase auszuführen, verwende
    git config --global pull.rebase true  
    

Erkennung von Dateiveränderungen beschleunigen

  • Um die Performance von git status und ähnlichen Befehlen zu verbessern, kannst du folgende Einstellungen verwenden
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# Fazit

  • Mit diesen Einstellungen lässt sich Git komfortabler nutzen, und einige davon werden auch von Core-Entwicklern aktiv verwendet
  • Durch die Optimierung der Git-Konfiguration lassen sich Arbeitsabläufe verbessern und Git effizienter einsetzen

7 Kommentare

 
brainypooh 2025-02-28

„Noch interessanter ist, dass die meisten von euch überhaupt nicht wissen, was das bedeutet“ – das trifft einen Nerv. 😱

 
tested 2025-02-27

Ist es nicht --global, sondern -global?

 
xguru 2025-02-27

--global ist richtig. Beim Kopieren und Einfügen ist mir ein Fehler unterlaufen. Das wurde korrigiert.

 
ilikeall 2025-02-26

Die Wiederverwendung der Konfliktlösung ist gut.

 
tujuc 2025-02-26

Ich nutze beim Diffen git-delta, um es im TUI-Format anzusehen.

  10   │ [core]  
  11   │     pager = delta  
  12   │ [interactive]  
  13   │     diffFilter = delta --color-only  
  14   │ [delta]  
  15   │     line-numbers = true  
  16   │     side-by-side = true  
  17   │     navigate = true  
  18   │     diff-so-fancy = true  
  19   │     hyperlinks = true  

Wenn mir das alles zu lästig ist, dann eben tig ... hahaha
Gibt es vielleicht noch etwas Besseres...?

 
GN⁺ 2025-02-26

Hacker-News-Kommentare

  • Mein Lieblingsalias ist git out. Es listet alle Commits auf, die noch nicht gepusht wurden. Ich verwende es ständig
    [alias]   
      out = "log @{u}.."   
    
  • Während viele Leute über ihre ~/.gitconfig nachdenken, empfehle ich delta als Begleiter für die git-CLI nachdrücklich
  • Meine ~/.gitconfig sieht so aus
    [alias]  
      co = checkout  
      ci = commit  
      st = status  
      br = branch  
      hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short  
      type = cat-file -t  
      dump = cat-file -p  
      dft = difftool  
    [tag]  
      sort = version:refname  
    [tar "tar.xz"]  
      command = xz -c  
    [tar "tar.zst"]  
      command = zstd -T0 -c  
    [log]  
      date = iso-local  
    [pull]  
      ff = only  
    [diff]  
      tool = difftastic  
    [safe]  
      directory = *  
    [advice]  
      detachedHead = false  
    [init]  
      defaultBranch = master  
    
  • Ich frage mich, warum Commit-Signaturen nicht in dieser Konfiguration enthalten sind. Mit modernen SSH-Schlüsseln ist das ganz einfach möglich
    [user]  
      name = xyz  
      email = xyz@domain.com  
      signingkey = ~/.ssh/id_algorithm.pub  
    
    [commit]  
      gpgsign = true  
    [tag]  
      gpgsign = true  
    
    [gpg]  
      format = ssh  
    
    # restrict allowed signers  
    # echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_*.pub)" >> ~/.git_allowed_signers  
    [gpg "ssh"]  
      allowedSignersFile = ~/git_allowed_signers  
    
    • Bei GitHub kann man SSH-Schlüssel sowohl für die Authentifizierung als auch für Signaturen hinzufügen. Man muss sie zwar zweimal hinzufügen, aber nach der einmaligen Einrichtung verschwindet das Label „unverified“ bei Commits
  • Julia Evans’ beliebte Git-Konfigurationsoptionen
  • Zusätzliche Optionen, die ich mag
    [apply]  
      # Remove trailing whitespaces  
      whitespace = fix  
    [color "diff"]  
      whitespace = red reverse  
    [diff]  
      colorMovedWS = allow-indentation-change  
    [format]  
      pretty = fuller  
    [log]  
      date = iso  
    [pull]  
      ff = only  
    
  • Meine Konfiguration ist hier. Im Grunde war das meiste bereits so gesetzt (außer der Column-UI). Wahrscheinlich, weil ich gute Texte von Scott und anderen gelesen habe
  • Ich stimme der Empfehlung für (z)diff3 zu. Der Artikel unterschätzt seine Bedeutung. Ein Drei-Wege-Diff ermöglicht Konfliktauflösungen, die mit dem Standardstil nicht möglich sind
  • Ich habe entdeckt, dass man git so einstellen kann, dass es den bevorzugten Pager verwendet. Also habe ich ihn auf bat gesetzt