I definitely think it's a great idea to try and evolve how Git is used from the command line.
At my current job, I've decided to create my own wrapper around both Git and Jira based on the workflow I've settled into after all these years as a programmer.
Here's a list of subcommands I wrote:
`develop <jira id>`: Creates a new branch based on the name of the Jira ticket (referenced by the Jira ID) and moves the ticket to "In Progress." The Jira ID is appended to the branch name so the CLI will always know what ticket we're working with.
`undo`: Uncommits the last commit but leaves the changes intact. Effectively an alias for `git reset HEAD~1 --mixed`.
`open changes`: Opens all the files that have changed between the current branch and the main branch in VS Code.
`list changes`: Simply lists the files that have changed between current branch and main without opening them.
`open issue`: Shows the Jira issue for the current branch in the terminal.
`log`: A more condensed version of `git log`. Alias for `git log --oneline`.
`commit`: Either uses a supplied commit message or, if one isn't provided, defaults to using the title of the Jira ticket. Most of the time I supply a message, but at my company we want the first commit to always be the same format so that all squash+merges describe the overall PR.
`create pr`: Commits a changelog entry, creates a PR in GitHub, always making sure to use an optimally formatted title, and moves the status of the Jira ticket to "In Review." It also adds labels and kicks off a QA deployment.
`merge pr`: Merges the open PR for the Jira ID of the branch and moves the Jira ticket to "In QA."
`wip`: Commits all present changes, using "WIP" as the commit message, and skips any pre-commit hooks that might either slow things down or block the commit. Alias for `git commit -m "WIP" --no-verify`. Yes, I know about `git stash`, but I'm always paranoid of clearing the stash, and stashes aren't (easily?) associated with specific branches.
`update`: Fetches the latest changes on main and then rebases the current branch off it. Admittedly, I don't like this name.
`push`: Basically the same as `git push` except it will refuse to ever push to the main branch, even if `force push` is used. And `force push` will always use `--force-with-lease`.
`my prs`: Lists the PRs I have open. Alias for `gh pr list --author "@me"`.
`branch`: Unlike `git branch`, only returns the name of the current branch, which is also useful for doing things with the branch programmatically.
`branches`: Does what `git branch` does.
`lunch`: Sets my Slack status to say I'm at lunch with the hamburger emoji.
`search log`: Searches the log using what comes after the first argument. Alias for `git log -S${@:2}`.
I know not all of that had to do specifically with Git, but both simplifying some common Git commands and integrating with Jira has made my job a much happier one. Hopefully this either inspires others to make their own job-specific CLI or implements some of these things in a Git-specific tool.