Part of the extraDefaults settings are based on this excellent article.

{ pkgs, ... }:
 
{
  programs.git = {
    enable = true;
    lfs.enable = true;
    delta.enable = true;
    aliases = {
      lol = ''log --graph --pretty=format:"%C(yellow)%h%Creset%C(cyan)%C(bold)%d%Creset %C(cyan)(%cr)%Creset %C(green)%ae%Creset %s"'';
    };
    extraConfig = {
      absorb.maxStack = 50;
 
      column.ui = "auto"; # use multiple column like `ls`
 
      diff = {
        submodule = "diff";
        algorithm = "histogram";
        colorMoved = "plain";
        mnemonicPrefix = true;
      };
 
      init.defaultBranch = "main";
 
      merge.conflictStyle = "zdiff3";
 
      pull.rebase = true;
 
      rerere = {
        enabled = true;
        autoupdate = true;
      };
 
      rebase = {
        autoSquash = true;
        autoStash = true;
        updateRefs = true;
      };
 
      status.submoduleSummary = true;
 
      tag.sort = "version:refname";
    };
  };
 
  home.packages = with pkgs.gitAndTools; [
    git-absorb
    git-filter-repo
    git-remote-gcrypt
  ];
 
  home.shellAliases = {
    gco = "git checkout";
    gcp = "git cherry-pick";
    grb = "git rebase";
    gst = "git status";
    gb = "git branch";
  };
}
home-manager