I use git quite a lot and despite the good documentation, it's nice to have some things at hand

Posted March 18, 2021 by Adrian Wyssmann

This page lists a collection of interesting git commands


Some good resources


Purpose Command
Reset to a specific commit-hash git reset --hard <commit-hash>
git push -f origin master
Reset to inital commit git update-ref -d HEAD
Reset local branch to status from remote git reset --hard <remote>/<branch>
Check out the fb branch, and rebase from master git checkout fb
git rebase master
Branches: delete a local branch1 git branch -d BRANCH_NAME
Branches: delete a remote branch1 git push --delete origin BRANCH_NAME
Branches: delete all branches on remote that are already merged1 git branch –merged | egrep -v “(^*|master|dev)” | xargs git branch -d
Tags: tag a commit git tag -a <tag> <commit> -m "<commit message>"
Tags: delete a tag on remote git push --delete origin [TAGNAME]
Tags: delete a tag locally git tag -d [TAGNAME]
Change author of a commit git commit --amend --author="Author Name <[email protected]>"
The GPG key used for signing your commits git config --global user.signingkey 0A46826A
Sign new tags git tag -s v1.5 -m 'my signed 1.5 tag'
Sign a commit git commit -a -S -m 'Signed commit'
check any signatures it finds and list them in its output git log --pretty="format:%h %G? %aN %s"
Defined the key to use for signing commits git config user.signingkey [KEYID]
Set signing of commits globally git config --global commit.gpgsign true

Useful One-liners

GET-DATE -Format o | Out-File .\; git add .\; git commit -m "Test"; git push

Remove credentials from git

git config --global --unset credential.helper
git config --system --unset credential.helper
git config --global credential.helper manager

My .gitconfig

Below my .gitconfig:

    editor = vi
    whitespace = fix,-indent-with-non-tab,trailing-space,cr-at-eol
    excludesfile = ~/.gitignore
    autocrlf = input
    browser = firefox
    tool = default-difftool
[difftool "default-difftool"]
    cmd = code-insiders --wait --diff $LOCAL $REMOTE
    fixup = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup [email protected]' -
    fixauto = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup [email protected] && git rebase -i --autosquash $REV^' -
    squash = !sh -c 'REV=$(git rev-parse $1) && git commit --squash [email protected]' -
    squauto = !sh -c 'REV=$(git rev-parse $1) && git commit --squash [email protected] && git rebase -i --autosquash $REV^' -
    # View abbreviated SHA, description, and history graph of the latest 20 commits
    l = log --pretty=oneline -n 20 --graph --abbrev-commit
    # View the current working tree status using the short format
    s = status -s
    # Show the diff between the latest commit and the current state
    d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
    # `git di $number` shows the diff between the state `$number` revisions ago and the current state
    di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
    # Pull in remote changes for the current repository and all its submodules
    p = git pull --recurse-submodules
    # Clone a repository including all submodules
    c = clone --recursive
    # Commit all changes
    ca = !git add -A && git commit -av
    # Switch to a branch, creating it if necessary
    go = "!f() { git checkout -b \"$1\" 2> /dev/null || git checkout \"$1\"; }; f"
    # Show verbose output about tags, branches or remotes
    tags = tag -l
    branches = branch -a
    remotes = remote -v
    # List aliases
    aliases = config --get-regexp alias
    # Amend the currently staged files to the latest commit
    amend = commit --amend --reuse-message=HEAD
    # Credit an author on the latest commit
    credit = "!f() { git commit --amend --author \"$1 <$2>\" -C HEAD; }; f"
    # Interactive rebase with the given number of latest commits
    reb = "!r() { git rebase -i HEAD~$1; }; r"
    # Remove the old tag with this name and tag the latest commit with it.
    retag = "!r() { git tag -d $1 && git push origin :refs/tags/$1 && git tag $1; }; r"
    # Find branches containing commit
    fb = "!f() { git branch -a --contains $1; }; f"
    # Find tags containing commit
    ft = "!f() { git describe --always --contains $1; }; f"
    # Find commits by source code
    fc = "!f() { git log --pretty=format:'%C(yellow)%h  %Cblue%ad  %Creset%s%Cgreen  [%cn] %Cred%d' --decorate --date=short -S$1; }; f"
    # Find commits by commit message
    fm = "!f() { git log --pretty=format:'%C(yellow)%h  %Cblue%ad  %Creset%s%Cgreen  [%cn] %Cred%d' --decorate --date=short --grep=$1; }; f"
    # Remove branches that have already been merged with master
    # a.k.a. ‘delete merged’
    dm = "!git branch --merged | grep -v '\\*' | xargs -n 1 git branch -d"
    # List contributors with number of commits
    contributors = shortlog --summary --numbered
    # Merge GitHub pull request on top of the current branch or,
    # if a branch name is specified, on top of the specified branch
    mpr = "!f() { \
        declare currentBranch=\"$(git symbolic-ref --short HEAD)\"; \
        declare branch=\"${2:-$currentBranch}\"; \
        if [ $(printf \"%s\" \"$1\" | grep '^[0-9]\\+$' > /dev/null; printf $?) -eq 0 ]; then \
            git fetch origin refs/pull/$1/head:pr/$1 && \
            git checkout -B $branch && \
            git rebase $branch pr/$1 && \
            git checkout -B $branch && \
            git merge pr/$1 && \
            git branch -D pr/$1 && \
            git commit --amend -m \"$(git log -1 --pretty=%B)\n\nCloses #$1.\"; \
        fi \
    }; f"
    # Show the user email for the current repository.
    whoami = config

[commit] gpgsign = true

[user] name = papanito email = [email protected] signkey = [email protected]

Edit this page