DEV Community

Cover image for What are your git aliases?
Jose Angel Munoz
Jose Angel Munoz

Posted on • Edited on

What are your git aliases?

Introduction

I've been requested multiple times about sharing my .gitconfig to copy my aliases.

I use git aliases for two reasons:

  1. To improve productivity.
  2. To remember interesting git commands and learn from them.

My Gitconfig

These are my aliases included in my ~/.gitconfig file for your reference:

[alias]
    a = add .
    aliases = config --get-regexp alias
    alias = ! git config --get-regexp ^alias\\. | sed -e s/^alias.// -e s/\\ /\\ $(printf \"\\043\")--\\>\\ / | column -t -s $(printf \"\\043\") | sort -k 1
    ap = add . -p
    addups = remote add upstream
    bd = branch -d
    bi = bisect
    bl = branch -l
    blr = branch -a
    br = branch -r
    ca = commit -a
    cam = commit -a -m
    ci = commit -m
    cia = commit --author='imjoseangel <anotheremail@example.com>' -m
    cm = commit
    co = checkout
    colast = checkout -
    comments = commit -m 📒Comments
    count = rev-list --count devel
    db = branch -D
    forgetAbout = rm --cached
    formatting = commit -m 💅Formatting
    fp = fetch -p
    grep = grep -F
    laf = fsck --lost-found
    last = log -1 HEAD
    latest = log -5 --pretty --oneline
    ls = ls-files --others --exclude-standard -z
    mend = commit --amend
    nb = checkout -b
    op = gc --prune=now --aggressive
    pdo = push -d origin
    pf = push --force-with-lease
    po = push origin
    pou = push --set-upstream origin
    pr = pull --rebase
    pror = remote prune origin
    prud = pull --rebase upstream devel
    prum = pull --rebase upstream main
    prune = remote update --prune
    ptag = push origin --tags
    ra = rebase --abort
    rc = rebase --continue
    refactor = commit -m 👷Refactor
    remotes = remote -v
    renb = branch -m
    rh = reset --hard
    rhh = reset --hard HEAD
    ri = rebase -i upstream/devel
    rim = rebase -i upstream/main
    rl = reflog
    rp = repack -ad
    s = status -s
    search = rev-list --all
    sh = show
    short = shortlog -sn
    sign = commit --amend --no-edit --signoff
    st = status
    stashes = stash list
    tests = commit --allow empty -m ✅Tests
    tuto = help tutorial
    tuto2 = help tutorial-2
    unstash = stash pop
    vc = clean -dfx
    wow = log --all --graph --decorate --oneline --simplify-by-decoration
Enter fullscreen mode Exit fullscreen mode

Running git alias after adding to the .gitconfig shows the list of all the aliases as a reference list.

To get more info, just run git help <command or alias>. For instance:

git help st
'st' is aliased to 'status'
Enter fullscreen mode Exit fullscreen mode
git help status
Enter fullscreen mode Exit fullscreen mode

There are two aliases I find interesting for beginners:

git tuto
git tuto2
Enter fullscreen mode Exit fullscreen mode

Comments and suggestions with different approaches are always welcomed.

Top comments (48)

Collapse
 
tpenguinltg profile image
tPenguinLTG

My aliases are either things I use regularly or things that I find useful on occasion and would otherwise have to look up every time. I've added explanatory comments to some of the less-obvious aliases.

[alias]
    # File changes
    ## gen-ignore <lang>: Outputs a .gitignore file for `lang` from gitignore.io to stdout.
    gen-ignore = "!_gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; _gi"
    ## ignore/hard-ignore: See https://stackoverflow.com/a/13631525
    ignore = update-index --assume-unchanged
    unignore = update-index --no-assume-unchanged
    hard-ignore = update-index --skip-worktree
    hard-unignore = update-index --no-skip-worktree
    ## ls-ignored: Lists files marked with assume-unchanged.
    ls-ignored = !git ls-files -v | grep '^[[:lower:]]' | cut -c 3-
    ## ls-hard-ignored: Lists files marked with skip-worktree.
    ls-hard-ignored = !git ls-files -v | grep -i '^S' | cut -c 3-
    word-diff = diff --word-diff
    char-diff = diff --word-diff --word-diff-regex='([^[:alnum:]]|[^[:space:]])'
    ## drop [stash_args...]: Like `reset HEAD`, but changes are recoverable from the stash reflog. Forwards arguments to `stash push`.
    drop = "!_drop() { git stash push \"$@\" && git stash drop; }; _drop"
    stat = status --short --branch

    # Commits
    ## init-commit: Initializes the repo and creates an empty initial commit.
    init-commit = !git init && git commit --allow-empty -m \"Initial commit\" -m \"This commit intentionally left blank.\"
    amend = commit --amend --no-edit
    fixup = commit --fixup
    squash = commit --squash

    # Log
    graph = log --graph --oneline
    log-yesterday = log --since=yesterday.midnight --oneline

    # Branches
    pulre = pull --rebase
    ## push-new: Pushes the current branch to `origin` with the same name and sets up tracking.
    push-new = push -u origin HEAD
    push-lease = push --force-with-lease
    ## sq [base_branch]: Starts an interactive rebase from the base of the branch relative to `base_branch`
    ##                   (defaults to `master`; can be any ref) without applying changes on top of `base_branch`.
    sq = "!_sq() { git rebase --interactive --autosquash $(git merge-base HEAD ${1:-master}); }; _sq"
Enter fullscreen mode Exit fullscreen mode

push-new can easily be rewritten to accept other remote names as arguments, and sq's default can be changed to use main or pull init.defaultBranch from the Git config instead of master.

I tend not to use too many short forms or have too many aliases because tab completion exists and I don't want to develop non-portable muscle memory.

Collapse
 
imjoseangel profile image
Jose Angel Munoz

Wow! I will take some from you and adding to my list of learning commands. Thanks!

Collapse
 
thomasbnt profile image
Thomas Bnt

Good timing this post!

I recreated my WSL space on my Windows 10, and I created some aliases for git and others commands.

aliases ga="git add"
aliases gc="git commit -m $1"
aliases gp="git push"
aliases gpu="git pull"
Enter fullscreen mode Exit fullscreen mode

😄🙌

Collapse
 
imjoseangel profile image
Jose Angel Munoz

Good ones @thomasbnt Thank you!!!

Collapse
 
ehaynes99 profile image
Eric Haynes

Great list! Will definitely add a few of these.

A few more that I like:

# oops, missed a file in prior commit
ca = commit --amend --no-edit
fa = fetch --all --prune
# IMO this option should be the default for force pushing
pf = push --force-with-lease
# thing you do for first push of a branch
pu = push -u origin HEAD
# create a WIP commit without running precommit
wip = commit -m\"WIP\" --no-verify
# "uncommit"
pop = reset HEAD^
# list branches by most recent commit
recent = for-each-ref --sort=-committerdate --count=30 --format='%(refname:short)' refs/heads/
Enter fullscreen mode Exit fullscreen mode
Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks for sharing @ehaynes99 ! I will take note of yours too.

Collapse
 
toddpress profile image
Todd Pressley • Edited

wow… @tpenguinltg ’s stuff - that’s on a different level entirely (: can’t wait to try some of those!

i use many of the aliases shared by others regularly. one alias in particular saves me a ton of time daily:

#!/bin/bash

alias gmd=“git checkout development && git pull && git checkout - && git merge development”
alias push=“gmd && git push”
Enter fullscreen mode Exit fullscreen mode
  1. stashes any wd changes
  2. checks out development/master/etc
  3. pulls the latest
  4. checks out the previous branch
  5. merges the latest from the main (e.g. development), then lastly

It’s not strictly a git alias, i know, though you could prob make that work 🤷‍♂️ never tried 😉 useful nonetheless IMH

I use it anytime i’m done with a feature and need push and open a PR on main.

great post. inspiring stuff!

Collapse
 
tpenguinltg profile image
tPenguinLTG

Did you know you can shorten your gmd alias to just git pull origin development (assuming origin is the correct remote)? It's not exactly the same since it won't update your local development branch, but it will do the important part and make your current branch up to date with the remote development.

Collapse
 
vikmstr profile image
Viktor Krejčíř

general ones:

alias gco="git checkout"
alias gpsp="git push -o ci.skip"
alias gswc="git switch -c"
alias gmwps="git push -o merge_request.create -o merge_request.target=master -o merge_request.merge_when_pipeline_succeeds"
alias gdfw="git diff --word-diff"
alias gmrt="git merge --strategy recursive -X theirs"
alias gbr="git branch --remotes --verbose --sort=-committerdate"
alias gbl="git branch --verbose --sort=-committerdate"
alias gps="git push"
alias gpl="git pull --rebase"
alias gpom="git push origin master"
alias gpomn="git push origin main"
alias gf="git fetch"
Enter fullscreen mode Exit fullscreen mode

And some specific commit messages (conventional commit is a thing):

alias gcsmb='f() { git commit -S -m "[BUILD]: $1"  };f'
alias gcsmc='f() { git commit -S -m "[CHORE]: $1"  };f'
alias gcsmf='f() { git commit -S -m "[FEAT]: $1"  };f'
alias gcsmfx='f() { git commit -S -m "[FIX]: $1"  };f'
alias gcsmd='f() { git commit -S -m "[DOCS]: $1"  };f'
alias gcsmt='f() { git commit -S -m "[TESTS]: $1"  };f'
Enter fullscreen mode Exit fullscreen mode
Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks for sharing @vikmstr !!!

Collapse
 
vikmstr profile image
Viktor Krejčíř

using zsh

Collapse
 
tw2113 profile image
Michael Beckwith

I mostly just stick with these:

alias gdiff="git difftool"
alias gap="git add -p"

Everything else is longform because I prefer to be familiar with the most common commands in case i'm ever not on a computer that's mine.

Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks @tw2113 I will add them to my list.

Collapse
 
fjones profile image
FJones • Edited

The only one I sometimes configure is git s for status, but even that I usually just type out. One thing I did alias was merging current branch to our integration branch, which lets me easily chain either the push or the push and checkout $currb after it, or waiting for the CI pipeline to start before pushing.

Though I do sometimes think about aliasing m to merge --no-edit and ca to merge --amend --no-edit, because I often forget to add the no-edit param and get annoyed by the need to quit nano.

Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks for your comments @fjones

Collapse
 
olsard profile image
olsard

Nice, thanks for sharing.
I would add some of my aliases

no-edit = commit --amend --no-edit
back = reset --soft HEAD~1
back2 = reset --soft HEAD~2
back3 = reset --soft HEAD~3
Enter fullscreen mode Exit fullscreen mode
Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks for sharing you too!!

Collapse
 
thisisobate profile image
Uchechukwu Obasi

Great aliases you've got!
I have just one git alias at the moment and that is:

[alias]
    ## sign your commit message
    csm = commit -s -m
Enter fullscreen mode Exit fullscreen mode

This comes very handy especially if you contribute to open source projects frequently.

Collapse
 
imjoseangel profile image
Jose Angel Munoz • Edited

Thanks @thisisobate ! Added to my list

Collapse
 
goodevilgenius profile image
Dan Jones
[alias]
        line = log --oneline
        st = status -sb
        last = log -1 HEAD --stat
        fap = fetch --all --prune
        cb = checkout -b
        gc-full = gc --prune=now --aggressive
        search = "!f() { s=\"$1\"; shift; if (( $# > 0 )); then set -- @; fi; git rev-list \"$@\" | xargs git grep \"$s\" ; }; f"
        changed-files = "!f() { git log --name-only --pretty=oneline --full-index \"$1\" | grep -vE '^[0-9a-f]{40}'|sort|uniq;}; f"
        push-new = !git push -u upstream $(git rev-parse --abbrev-ref @)
Enter fullscreen mode Exit fullscreen mode

Also, for work specifically, my company works on GitHub, and I have a bash script to easily create a new PR from the current branch.

#!/bin/bash

set -eu

declare -r UPSTREAM_NAME=upstream
declare MERGE_BRANCH=main

declare -r BRANCH=$(git rev-parse --abbrev-ref HEAD)

declare UPSTREAM_URL=$(git remote get-url upstream)
UPSTREAM_URL=$(echo "$UPSTREAM_URL" | sed -E -e 's|^git@|https://|' -e 's|.com:|.com/|' -e 's/.git$//')

MERGE_BRANCH=${1:-$MERGE_BRANCH}

declare -r PR_URL="${UPSTREAM_URL}/compare/${MERGE_BRANCH}...${BRANCH}?expand=1"

echo $PR_URL
open $PR_URL
Enter fullscreen mode Exit fullscreen mode

I name it git-new-pr, and add it to my $PATH. Then, I can call git new-pr, and it'll automatically open up a page for a new PR in my browser.

This script is for macOS. So, the last line opens the URL in the default browser. If using Linux, this could be xdg-open $PR_URL. Also, a specific browser could be specified.

Most people would just use the GitHub cli for this, but I've never bothered installing it, and this works really well.

Collapse
 
imjoseangel profile image
Jose Angel Munoz

Thanks for sharing @goodevilgenius !!