====== git aliases I use all the time ====== ==== 1. choose branch to check out from fzf ==== ''fzf'' is such a great tool, it changes the way how I operate in vim and shell, git checkout autocomplate with branch is great, but it's better to list branches in a menu then choose it, therefore I add below to git config file: cof = !git for-each-ref --format='%(refname:short)' refs/heads | fzf | xargs git checkout so this one-liner list all local branches in fzf, then I could type to narrow down, then press enter to check out the selected branch. Sometimes, I want to checkout remote branch, I use alias below, ''refname:lstrip=3'' strips the remote name from branch name ref, so git checkout could figure out and create a local branch to match it. cofr = !git for-each-ref --format='%(refname:lstrip=3)' refs/remotes | fzf | xargs git checkout ==== 2. bulk delete branches ==== delete-branches = "!git branch | grep -v '\\*' | fzf --multi | xargs git branch --delete --force" The idea is list all local branches, but remove current branch (it's marked with *), pipe to fzf so user could select them by pressing ''tab'', finally pipe to git to delete. ==== 3. List local branches by commit date ==== More informative branch list with tip commit message and relative date. bl = branch --format='%(HEAD) %(color:yellow)%(committerdate:relative)\t%(color:red)%(refname:short)%(color:cyan)\n\t\t%(contents:subject) %(color:green) [%(authorname)]' --sort=-committerdate ==== 4. Copy commit hash from git log in fzf ==== pickhash = !git log --abbrev-commit --color=always | fzf --ansi | awk '{print $1}' | pbcopy ==== 5. Pick a commit, then pick changed file and open in vim ==== edited-files = !git pickhash | xargs -o git show --format="format:" --name-only pickfile = !git edited-files | fzf --sync | sed -e "s#^#`git rev-parse --show-toplevel`/#" | xargs -o vim