{
  lib,
  config,
  ...
}:
let
  inherit (lib) mkIf;

  cfg = config.marleyos.programs.git;
in
{
  config = mkIf cfg.enable {

    #     █████╗ ██╗     ██╗ █████╗ ███████╗███████╗███████╗
    #    ██╔══██╗██║     ██║██╔══██╗██╔════╝██╔════╝██╔════╝
    #    ███████║██║     ██║███████║███████╗█████╗  ███████╗
    #    ██╔══██║██║     ██║██╔══██║╚════██║██╔══╝  ╚════██║
    #    ██║  ██║███████╗██║██║  ██║███████║███████╗███████║
    #    ╚═╝  ╚═╝╚══════╝╚═╝╚═╝  ╚═╝╚══════╝╚══════╝╚══════╝

    programs.git.aliases =
      let
        fish_fns = config.programs.fish.functions;
      in
      {
        ### Staging ###

        a = "add";
        aa = "add --all";

        # Interactively stage parts of a file.
        apa = "add --patch";

        da = "diff";
        das = "diff --staged";
        daw = "diff --word-diff"; # Show diff by word.
        dasw = "diff --staged --word-diff";

        d = "!f() { git diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f";
        ds = "!f() { git diff --staged \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f";
        dw = "!f() { git diff --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f";
        dsw = "!f() { git diff --staged --word-diff \"$@\" ':(exclude)package-lock.json' ':(exclude)*.lock'; }; f";

        st = "status --short --branch";
        stu = "status --short --branch --untracked-files";
        stl = "status";

        ### Committing ###

        c = "commit";
        ce = "commit --amend";
        cen = "commit --amend --no-edit --no-verify";
        ca = "!git add --alll && git commit";
        cae = "!git add --all && git commit --amend";
        caen = "!git add --all && git commit --amend --no-edit --no-verify";
        cfu = "commit --fixup";

        rev = "revert";

        ### Working Dir & Index Manipulation ###

        co = "checkout";

        rt = "reset";

        rts = "reset --soft"; # undo commits & stage their changes

        rs = "restore --worktree"; # revert local changes
        rst = "restore --staged"; # unstage things
        rsa = "restore --worktree --staged";

        rss = "restore --worktree --source"; # specify a commit to revert to
        rsts = "restore --staged --source";
        rsas = "restore --worktree --staged --source";

        rmc = "rm --cached"; # leave worktree copy alone

        sta = "stash push";
        stam = "stash push --message";
        staa = "stash push --include-untracted";
        staam = "stash push --include-untracted --message";

        stap = "stash pop";
        stal = "stash list";
        stas = "stash show --text";

        cl = "clean -force"; # remove untracked & unignored files
        cldr = "clean --dry-run";

        ### Branches ###

        b = "branch";
        cb = "checkout -b";
        cm = lib.mkIf (fish_fns ? git_main_branch) "!git checkout $(git_main_branch)";
        cd = lib.mkIf (fish_fns ? git_develop_branch) "!git checkout $(git_develop_branch)";

        m = "merge";
        mtl = "mergetool --no-prompt";
        ma = "merge --abort";

        cp = "cherry-pick";
        cpa = "cherry-pick --abort";
        cpc = "cherry-pick --continue";
        cpq = "cherry-pick --quit";

        ### Remotes ###

        p = "push";
        pv = "push --verbose";
        pdr = "push --dry-run";
        pf = "push --force-with-lease --force-if-includes";
        pfv = "push --verbose --force-with-lease --force-if-includes";
        pff = "push --force";
        pffv = "push --verbose --force";

        f = "fetch";
        fa = "fetch --all --prune";

        pl = "pull";
        plr = "pull --rebase";

        sub = "submodule";
        subu = "submodule update --init --recursive";

        r = "remote";
        rv = "remote --verbose";
        ra = "remote add";
        rrm = "remote remove";
        rmv = "remote rename";
        rset = "remote set-url";
        rup = "remote update";

        ### Logs ###

        # Current branch.
        l = "log --pretty=lc --graph";
        lo = "log --pretty=lo --graph --date=human";
        ls = "log --pretty=lo --graph --date=human --simplify-by-decoration";
        lf = "log --pretty=lf --graph";
        ld = "log --pretty=lf --graph --cc --stat";
        lp = "log --pretty=lf --graph --cc --patch";

        lr = "log -5 --pretty=lc --graph";
        lro = "log -5 --pretty=lo --graph --date=human";
        lrs = "log -5 --pretty=lo --graph --date=human --simplify-by-decoration";
        lrf = "log -5 --pretty=lf --graph";
        lrd = "log -5 --pretty=lf --graph --cc --stat";
        lrp = "log -5 --pretty=lf --graph --cc --patch";

        # All branches on all remotes.
        la = "log --pretty=lc --graph --all";
        lao = "log --pretty=lo --graph --all --date=human";
        las = "log --pretty=lo --graph --all --date=human --simplify-by-decoration";
        laf = "log --pretty=lf --graph --all";
        lad = "log --pretty=lf --graph --all --cc --stat";
        lap = "log --pretty=lf --graph --all --cc --patch";

        lar = "log -5 --pretty=lc --graph --all";
        laro = "log -5 --pretty=lo --graph --all --date=human";
        lars = "log -5 --pretty=lo --graph --all --date=human --simplify-by-decoration";
        larf = "log -5 --pretty=lf --graph --all";
        lard = "log -5 --pretty=lf --graph --all --cc --stat";
        larp = "log -5 --pretty=lf --graph --all --cc --patch";

        ### Shortcuts ###

        nevermind = "!git reset --hard head && git clean -df";

        open = lib.mkIf (config.programs.fish.enable && (fish_fns ? git_open)) "!fish -c git_open";

        chash = "!git log --oneline | gum filter --height 10 | cut -d' ' -f1 | cb &>/dev/null";
      };
  };
}
