DEV Community

Cover image for Simplifying Your Git Workflow with Aliases
Rogério Rodrigues de Alcântara
Rogério Rodrigues de Alcântara

Posted on

1

Simplifying Your Git Workflow with Aliases

Simplifying Your Git Workflow with Aliases

Introduction to Git Aliases

Git aliases are a powerful feature that allows you to create custom shortcut commands for longer Git command sequences. They can significantly simplify and speed up your Git workflow by reducing repetitive typing and complexity.

How to Configure Git Aliases

Configuring a Git alias is straightforward. You can define aliases in the .gitconfig file located in your home directory, or you can set them directly via the command line using the git config command.

Setting an Alias via .gitconfig

To set an alias in .gitconfig, you need to edit the file and add your alias under the [alias] section. For example:

[alias]
  co = checkout
  br = branch
  ci = commit
Enter fullscreen mode Exit fullscreen mode

Setting an Alias via Command Line

Alternatively, you can set an alias directly from the command line:

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
Enter fullscreen mode Exit fullscreen mode

This will update your .gitconfig file with the new aliases.

Examples of Git Aliases

Let's explore some practical examples of Git aliases from the attached file, showcasing how they can simplify your daily Git usage:

1. Quick Commit: Instead of typing git commit -m "Your message", use:

cm = commit -m
Enter fullscreen mode Exit fullscreen mode

Usage:

git cm "Your initial commit"
Enter fullscreen mode Exit fullscreen mode

2. Interactive Rebase: Replace the lengthy git rebase -i HEAD~3 with:

ri = rebase -i
Enter fullscreen mode Exit fullscreen mode

Usage:

git ri HEAD~3
Enter fullscreen mode Exit fullscreen mode

3. Staging All Changes: Use a simple git aa instead of git add --all:

aa = add --all
Enter fullscreen mode Exit fullscreen mode

4. Viewing Logs: Instead of git log --oneline --graph --all, configure:

lg = log --oneline --graph --all
Enter fullscreen mode Exit fullscreen mode

Usage:

git lg
Enter fullscreen mode Exit fullscreen mode

5. Deleting Branches: Replace git branch -d with:

bd = branch -d
Enter fullscreen mode Exit fullscreen mode

Usage:

git bd feature-branch
Enter fullscreen mode Exit fullscreen mode

Useful Git Aliases

To further streamline your Git experience, I've compiled an extensive list of Git aliases that cover a wide range of functionalities, from basic commit operations to advanced log filtering. This comprehensive list is designed to cater to both novice and seasoned Git users.

# https://git-scm.com/docs/git-config#Documentation/git-config.txt-alias
[alias]
# Add files to the staging area
# @example: git a
a=add
# Add all files to the staging area
# @example: git aa
aa=add --all
# Commit the staged changes
# @example: git c
c=commit
# Commit with a message
# @example: git cm
cm=commit --message
# Commit without running hooks
# @example: git cn
cn=commit --no-verify
# Commit with a message, without running hooks
# @example: git cmn
cmn=commit --message --no-verify
# Amend the last commit
# @example: git ca
ca=commit --amend
# Amend the last commit without running hooks
# @example: git can
can=commit --amend --no-verify
# Amend the last commit, reusing the same message
# @example: git car
car=commit --amend --reuse-message HEAD
# Commit all changes
# @example: git caa
caa=commit --all
# Commit all changes without running hooks
# @example: git caan
caan=commit --all --no-verify
# Commit all changes with a message
# @example: git caam
caam=commit --all --message
# Work-in-progress commit of all changes
# @example: git wip "Temp"
wip=!git commit --all --no-verify --message 'wip: '${1:-Temp}
# Reset HEAD softly to a specific commit
# @example: git rh
# @example: git rh [commit]
rh=!git reset --soft ${1:-HEAD}
# Reset HEAD hard to a specific commit
# @example: git rhr
# @example: git rhr [commit]
rhr=!git reset --hard ${1:-HEAD}
# Restore working directory files
# @example: git discard
discard=!git restore ${1:-.}
# Unstage files from the staging area
# @example: git unstage
unstage=!git restore --staged ${1:-.}
# Undo the last commit
# @example: git undo
# @example: git undo [commit]
undo=!git reset ${1:-HEAD}^
# root - Delete the HEAD reference
# @example: git undo-from-root
undo-from-root=update-ref -d HEAD
# Show short status of the repository
# @example: git st
st=status --short
# Show the status of the repository
# @example: git sts
sts=status
# Show short status with branch information
# @example: git stv
stv=status --short --branch
# List files with merge conflicts
# @example: git conflicts
conflicts=!git st | grep '^[UMDA]\\{2\\} ' | awk '{ print $2 }'
# List all staged files
# @example: git staged
staged=!git st | grep '^[M|A|D]'
# List all unstaged but tracked files
# @example: git unstaged
unstaged=!git st | grep '^ [M|A|D]'
# List all untracked files
# @example: git untracked
untracked=!git st | grep '^?'
# List all files with changes, including untracked and modified
# @example: git changes
changes=!git st | grep -E '\\?| M|MM|DM| D'
# Display the log with color
# @example: git l
l=log --color=always
# Display the last 100 commits from all branches with color
# @example: git lo
lo=log --color=always --all --max-count=100
# Display a colored graphical log of all branches
# @example: git lolg
lolg=log --color=always --all --graph
# Show the last commit with file changes statistics
# @example: git last
last=log -1 HEAD --stat
# Display a graphical tree of all commits and branches
# @example: git tree
tree=log --graph --oneline --all
# List commit hashes
# @example: git commits
commits=log --pretty='%h'
# Show the hash of the last commit
# @example: git last-commit
last-commit=log -1 HEAD --pretty='%h'
# List branches with detailed information
# @example: git b
b=branch --verbose --verbose --color=always
# List all branches with detailed information
# @example: git bv
bv=branch --verbose --verbose --color=always --list
# List all branches (local and remote) with detailed information
# @example: git ba
ba=branch --verbose --verbose --color=always --list --all
# Delete a specified branch
# @example: git bd [branch-name]
bd=branch --delete
# Show multiple branches and their divergences
# @example: git bs
bs=show-branch
# List branches that are merged into the current HEAD
# @example: git merged
merged=branch --no-color --merged
# List all local branches except HEAD
# @example: git branches
branches=!git ba | grep -v 'HEAD'
# Get the name of the current branch
# @example: git current-branch
current-branch=rev-parse --abbrev-ref HEAD
# Get the default branch name (e.g., main or master)
# @example: git main-branch
main-branch=config init.defaultBranch
# Delete branches that are merged, excluding main, master, and develop
# @example: git clear-merged
clear-merged=!git merged | grep -v '\\*\\|main\\|master\\|develop' | xargs git branch -D
# List remote branches for a specified remote (default: origin)
# @example: git remote-branches [remote-name]
remote-branches=!git branch -a | grep remotes/${1:-origin}/ | cut -f 3 -d '/'
# Deinitialize and remove a specified submodule
# @example: git remove-submodule [submodule-path]
remove-submodule=!git submodule deinit -f -- ${1} && rm -rf .git/modules/${1} ${1}
# Synchronize and update all submodules recursively
# @example: git update-submodules
update-submodules=!git submodule sync && git submodule update --recursive
# Switch to a specified branch or commit
# @example: git co [branch-name]
co=checkout
# Create and switch to a new branch
# @example: git cob [new-branch-name]
cob=checkout -b
# Guess and switch to a branch based on partial input
# @example: git cog [partial-branch-name]
cog=checkout --guess
# Rebase the current branch with statistics
# @example: git r [base-branch]
r=rebase --stat
# Abort an ongoing rebase
# @example: git ra
ra=rebase --abort
# Continue a rebase after resolving conflicts
# @example: git rc
rc=rebase --continue
# Skip a patch during a rebase
# @example: git rs
rs=rebase --skip
# Start an interactive rebase
# @example: git ri [base-branch]
ri=rebase --interactive
# Start an interactive rebase with automatic stash and apply
# @example: git ris [base-branch]
ris=rebase --interactive --autostash
# Start an interactive rebase with automatic squash
# @example: git risq [base-branch]
risq=rebase --interactive --autosquash
# Perform an interactive rebase with autostash and show stats, defaulting to HEAD
# @example: git autosrebase [commit]
autosrebase=rebase --autostash --interactive --stat ${1:-HEAD}
# Perform an autosrebase starting from the parent of a specified commit
# @example: git rebase-from [commit]
rebase-from="!f() { COMMIT=$(git rev-parse ${1:-HEAD}); git autosrebase $COMMIT^; }; f"
# Begin an autosrebase, setting the latest commit to be edited
# @example: git edit [commit]
edit="!f() { GIT_SEQUENCE_EDITOR='sed -i -e 1s/^pick/edit/' git autosrebase ${1:-HEAD}^; }; f"
# Start an autosrebase, dropping the latest commit
# @example: git drop [commit]
drop="!f() { GIT_SEQUENCE_EDITOR='sed -i -e 1s/^pick/drop/' git autosrebase ${1:-HEAD}^; }; f"
# Begin an autosrebase, rewording the latest commit
# @example: git reword [commit]
reword="!f() { GIT_SEQUENCE_EDITOR='sed -i -e 1s/^pick/reword/' git autosrebase ${1:-HEAD}^; }; f"
# Create a fixup commit for a specified commit
# @example: git fixup [commit]
fixup="!f() { COMMIT=$(git rev-parse ${1:-HEAD}); git commit --no-verify --fixup $COMMIT; }; f"
# Create a fixup commit for a specified commit and autosquash it
# @example: git fix [commit]
fix="!f() { COMMIT=$(git rev-parse ${1:-HEAD}); git commit --no-verify --fixup $COMMIT; GIT_SEQUENCE_EDITOR=: git rebase --autosquash -i $COMMIT^; }; f"
# Create a squash commit for a specified commit
# @example: git squash [commit]
squash="!f() { git commit --squash ${1:-HEAD} --no-verify --no-post-rewrite; }; f"
# Stage all changes and create a fixup commit for a specified commit
# @example: git fix-all [commit]
fix-all=!git add . && git fix ${1:-HEAD}
# Stage all changes and create a squash commit for a specified commit
# @example: git squash-all [commit]
squash-all=!git add . && git squash ${1:-HEAD}
# Cherry-pick a commit
# @example: git cp [commit-hash]
cp=cherry-pick
# Abort an ongoing cherry-pick operation
# @example: git cpa
cpa=cherry-pick --abort
# Continue a cherry-pick after resolving conflicts
# @example: git cpc
cpc=cherry-pick --continue
# Skip a commit during a cherry-pick
# @example: git cps
cps=cherry-pick --skip
# Stash current changes
# @example: git s
s=stash
# Stash all changes, including untracked files and ignored files
# @example: git saa
saa=stash --all
# Stash changes without stashing changes already added to the index
# @example: git stsh
stsh=stash --keep-index
# Pop the top stash entry
# @example: git sp
sp=stash pop
# Save changes in a new stash
# @example: git ss [message]
ss=stash save
# Drop the top stash entry
# @example: git sd
sd=stash drop
# Apply the top stash entry
# @example: git sa
sa=stash apply
# List stashes in a pretty format
# @example: git stashes
stashes=stash list --pretty=format:%gd
# Show the patch and statistics for the top stash entry
# @example: git sst
sst=stash show --patch --stat
# Show the patch for a specified stash entry
# @example: git ssw [stash-index]
ssw=stash show -p stash@{${1:-0}}
# Stash changes including untracked files
# @example: git ssu
ssu=stash save --include-untracked
# Show patches for all stashes
# @example: git patches
patches="!f() { for s in $(git stashes); do git stash show -p $s; done; };f"
# Fetch updates from the remote
# @example: git f
f=fetch
# Fetch updates from all remotes
# @example: git fa
fa=fetch --all
# Pull updates from the remote
# @example: git u
u=pull
# Pull with fast-forward only, showing stats and pruning
# @example: git uf
uf=pull --ff-only --stat --prune
# Pull with rebase
# @example: git ur
ur=pull --rebase
# Pull with rebase from the origin remote for the current branch
# @example: git up
up=pull --rebase origin HEAD
# Pull with rebase from the origin remote for the main branch
# @example: git uu
uu=!git pull --rebase origin $(git main-branch)
# Pull with rebase from the upstream remote for the main branch
# @example: git uup
uup=!git pull --rebase upstream $(git main-branch)
# Push the current branch to the origin remote with verbose output
# @example: git p
p=!git push --verbose origin $(git current-branch)
# Force push (with lease) the current branch to the origin remote with verbose output
# @example: git pf
pf=!git push --verbose origin $(git current-branch) --force-with-lease
# Push all branches to the origin remote with verbose output
# @example: git pa
pa=!git push --verbose origin $(git current-branch) --all
# Push tags of the current branch to the origin remote with verbose output
# @example: git pt
pt=!git push --verbose origin $(git current-branch) --tags
# Push the current branch to the origin remote and set it as upstream with verbose output
# @example: git pc
pc=!git push --verbose --set-upstream origin $(git current-branch)
# Pull and then push the current branch to/from the origin remote with verbose output
# @example: git pp
pp=!git pull origin $(git current-branch) && git push --verbose origin $(git current-branch)
# Show differences between commits, commit and working tree, etc.
# @example: git d
d=diff
# Show differences made since midnight of the current day
# @example: git today
today=diff --stat 'HEAD@{midnight}'
# Show differences made on the previous day
# @example: git yesterday
yesterday=diff --stat 'HEAD@{yesterday}' 'HEAD@{midnight}'
# List remote repositories with detailed information
# @example: git re
re=remote --verbose --verbose
# Prune all stale remote tracking branches
# @example: git rep
rep=remote prune
# Update remote branches and prune any stale branches
# @example: git reu
reu=remote update --prune
# Change a global configuration setting
# @example: git cg [setting] [value]
cg=config --global
# List all global configuration settings
# @example: git configs
configs=config --global --list
# List all configuration settings with their origin
# @example: git cfgs
cfgs=config --list --show-origin
# Interactively search through all configuration settings and their origins
# @example: git cfgz
cfgz=!git cfgs | fzf --ansi
# Get the top-level directory of the Git repository
# @example: git root-dir
root-dir=rev-parse --show-toplevel
# Remove files from the repository that match a given pattern
# @example: git remove-files '[pattern]'
remove-files="!f(){ find . -name $1 -print0 | xargs -0 git rm -f --ignore-unmatch; }; f"
# Get the configured pager used by Git
# @example: git pager
pager=config --get core.pager
# Shorten a URL using git.io
# @example: git shorten [url]
shorten=!sh -c 'curl -i https://git.io -F url=$1'
# Extract the first 7 characters of a commit hash
# @example: git grep-commit
grep-commit=!sh -c 'grep -o "[a-f0-9]{7}" | cut -d" " -f1 | tr -d "\n"'
# Get the last word in a line, often used to get the last part of a branch name
# @example: git tail
tail=!rev | cut -d' ' -f 1 | rev
# Extract the branch name from a string
# @example: git grep-branch
grep-branch=!sh -c 'sed "s/^..//g" | rev | cut -d" " -f 1 | rev'
# Extract the branch name from a string, removing 'remotes/origin/' prefix
# @example: git head-branch
head-branch=!sh -c 'sed "s/^..//g" | cut -d" " -f 1 | tr -d "\n" | sed "s@remotes/origin/@@"'
# Interactive log view using fzf to select a commit
# @example: git fzl
fzl=!git log --color=always | fzf --ansi | git grep-commit
# Interactive diff selection with fzf for multiple files
# @example: git fzdiff [options]
fzdiff=!HASH=$(git diff $@ --name-only | fzf --multi --ansi --header \" git diff [ --preview 'git diff $@ --color=always -- {-1}' <pathspec >…​]\")
# Interactive add using fzf to select multiple files with changes
# @example: git fza
fza=!HASH=$(git changes | fzf --ansi -m --header \" git add --force [ ^-x\t- restore [ ^-s\t- restore --staged [ --preview 'git diff $@ --color=always -- {-1}' --bind 'ctrl-x:reload(git restore $(cut -d \" \" -f3 <<<{}) 1>/dev/null && git changes)' --bind 'ctrl-u:reload(git restore --staged $(cut -d \" \" -f3 <<<{}) 1>/dev/null && git changes)' <pathspec >…​]\n >git <pathspec >…​]\nﮦ >git <pathspec >…​]\" | git tail) && git add $(echo ${HASH} | awk '{ print $0 }') && git status
# Interactive unstage using fzf to select unstaged files
# @example: git fzu
fzu=!HASH=$(git unstaged | fzf --ansi -m --header \" git restore [ --preview 'git diff $@ --color=always -- {-1}' <pathspec >…​]\" | git tail) && git restore -- $(echo ${HASH} | awk '{ print $0 }') && git st -b
# Interactive unstage staged files using fzf
# @example: git fzus
fzus=!HASH=$(git staged | fzf --ansi -m --header \" git restore --staged [ --preview 'git diff $@ --color=always -- {-1}' <pathspec >…​]\" | git tail) && git restore --staged -- $(echo ${HASH} | awk '{ print $0 }') && git st -b
# Interactive checkout branch using fzf
# @example: git fzc
fzc=!HASH=$(git branches | fzf --ansi --header \" git checkout --guess [ <branch >]\" | git head-branch) && [[ -n \"${HASH}\" ]] && git checkout --guess $(echo ${HASH} | awk '{ print $1 }')
# Interactive delete branch using fzf
# @example: git fzbd
fzbd=!HASH=$(git branches | fzf --ansi -m --header \" git branch -d [ <branch >]\" | git head-branch --preview 'git branch -d $@ --color=always -- {-1}' | git tail) && [[ -n \"${HASH}\" ]] && git branch -d $(echo ${HASH} | awk '{ print $1 }')
# Interactive force delete branch using fzf
# @example: git fzbx
fzbx=!HASH=$(git branches | fzf --ansi -m --header \" git branch -D [ <branch >]\" | git head-branch --preview 'git branch -D $@ --color=always -- {-1}' | git tail) && [[ -n \"${HASH}\" ]] && git branch -D $(echo ${HASH} | awk '{ print $1 }')
# Interactive rebase using fzf to select a commit
# @example: git fzr
fzr=!HASH=$(git log --color=always | fzf --ansi --header \" git rebase --autostash --interactive --stat [ <options >]^\n\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git rebase-from $(echo ${HASH} | awk '{ print $1 }')
# Interactive fixup using fzf to select a commit
# @example: git fzf
fzf=!HASH=$(git log --color=always | fzf --ansi --header \" git fixup [ <pathspec >…​]\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git fix $(echo ${HASH} | awk '{ print $1 }') && git st -b
# Interactive reword using fzf to select a commit
# @example: git fzw
fzw=!HASH=$(git log --color=always | fzf --ansi --header \" git reword [ <options >]\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git reword $(echo ${HASH} | awk '{ print $1 }')
# Interactive edit using fzf to select a commit
# @example: git fze
fze=!HASH=$(git log --color=always | fzf --ansi --header \" git edit [ <options >]\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git edit $(echo ${HASH} | awk '{ print $1 }')
# Interactive drop commit using fzf
# @example: git fzd
fzd=!HASH=$(git log --color=always | fzf --ansi --header \" git drop [ <options >]\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git drop $(echo ${HASH} | awk '{ print $1 }')
# Interactive soft reset using fzf
# @example: git fzhs
fzhs=!HASH=$(git log --color=always | fzf --ansi --header \" git reset --soft [ <options >]^\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git reset --soft $(echo ${HASH} | awk '{ print $1\"^\" }') && git st -b
# Interactive hard reset using fzf
# @example: git fzhh
fzhh=!HASH=$(git log --color=always | fzf --ansi --header \" git reset --hard [ <options >]^\" | git grep-commit) && [[ -n \"${HASH}\" ]] && git reset --hard $(echo ${HASH} | awk '{ print $1\"^\" }') && git st -b
# Interactive unstage files using fzf
# @example: git fzunstage
fzunstage=!HASH=$(git staged | sed -E 's/(M|A|D) //' | fzf --ansi --header-lines=1 --multi --ansi --header ' git rm --cached <file
view raw git-aliases.ini hosted with ❤ by GitHub

How to Use the Gist

  1. Explore the Gist: Browse through the list of aliases in the Gist. Each alias is accompanied by a brief description, making it easier to understand its purpose and usage.

  2. Incorporate Into Your Workflow: Select the aliases that resonate with your daily Git tasks. You can add these aliases to your .gitconfig file or set them up using the git config command, as explained earlier in this post.

  3. Customization: Feel free to modify or expand upon these aliases to better fit your personal workflow. Git aliases are highly flexible and can be tailored to meet your specific needs.

Sharing and Collaboration

If you have suggestions or additional aliases that could benefit others, consider contributing to the Gist. Collaboration and knowledge sharing are key to enhancing our collective Git experience.

Final Thoughts

With this extensive list of Git aliases and the foundational knowledge from this post, you're well-equipped to make your Git usage more efficient and enjoyable. Embrace the power of Git aliases and watch your productivity soar!

Remember, the key to effective use of Git aliases lies in identifying the Git commands you use most frequently and simplifying them to suit your workflow.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more