• Practise:

  • Cheatsheet

    • 4 Pages:

    • 2 Pages:

    • 2 Pages:

  • Books


my functions:

source /dev/stdin <<< "$(curl -sSL"


cat .git/HEAD       # current branch head
    ref: refs/heads/master
cat .git/ORIG_HEAD ; git show | head -1

working tree don't include untracked files


git commit -am "save arezzo files"
git commit --amend
    -c, --reedit-message <commit>   # reuse and edit message from specified commit
    -C, --reuse-message <commit>    # reuse message from specified commit


git log [<options>] [<revision-range>] [[--] <path>...]
git show [<options>] <object>...
git show [path] # details of last commit log
git log --since=2.weeks

branch and merge

git branch -a       # list all

git checkout -b dev # create and checkout a new branch

git checkout master
git merge dev       # merge dev into master
    --squash              create a single commit instead of doing a merge
    --abort               abort the current in-progress merge


git checkout -- <file>    # discard changes in working directory

git reset HEAD~2    # undo 2 changes that haven’t been shared
git reset <paths>   # opposite of `git add <paths>`
    --soft                reset HEAD only
    --mixed               reset HEAD and index (default)
    --hard                reset HEAD, index and working tree
    --merge               reset HEAD, index and working tree
    --keep                reset HEAD but keep local changes

git revert HEAD~2   # undo 2 changes on a public branch

git reset master
git checkout master


git stash
git stash list
git stash apply/pop
git stash apply stash@{2}
git stash drop
git stash drop stash@{0}

remote and push

git remote -v
git remote add [<options>] <name> <url>
    -f, --fetch           fetch the remote branches
    -t, --track <branch>        # branch(es) to track
    -m, --master <branch>
    --mirror[=<push|fetch>]     # set up remote as a mirro

cat .git/config
    `refspec`:     +<src>:<dst>
    <src> is the pattern for references on the remote side
    <dst> is where those references will be tracked locally

    [remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/heads/master:refs/remotes/origin/master
        fetch = +refs/heads/foo/*:refs/remotes/origin/foo/*

git push -u origin master:refs/heads/foo/master

        push = refs/heads/master:refs/heads/qa/master

tree .git/refs/
    ├── heads
    │   ├── dev
    │   └── master
    ├── remotes
    │   └── origin
    │       └── HEAD
    └── tags

git push [<options>] [<repository> [<refspec>...]]
    -u, --set-upstream    set upstream for git pull/status
git pull origin master # fetch + merge

delete remote branch

git push origin :topic
git push origin --delete topic


git config -l
    --global              ~/.gitconfig
    --local               .git/config
    --system              /etc/gitconfig

    --get                 get value: name [value-regex]
    --get-all             get all values: key [value-regex]
    --get-regexp          get values for regexp: name-regex [value-regex]
    --get-urlmatch        get value specific for the URL: section[.var] URL
    --replace-all         replace all matching variables: name value [value_regex]
    --add                 add a new variable: name value
    --unset               remove a variable: name [value-regex]
    --unset-all           remove all matches: name [value-regex]

git config --global push.default simple
git config --list --show-origin


git config --global http.proxy http://$IP:$Port


[--setup <command>] 
[--env-filter <command>]
[--tree-filter <command>] 
[--index-filter <command>]
[--parent-filter <command>] 
[--msg-filter <command>]
[--commit-filter <command>] 
[--tag-name-filter <command>]
[--subdirectory-filter <directory>] 
[--original <namespace>]
[-d <directory>] [-f | --force] [--] [<rev-list options>...]

Remove File

Unpushed commit

git rm --cached giant_file # leave it on disk
git commit --amend -CHEAD

Every commit

git filter-branch --tree-filter 'rm -f filename' HEAD
    --all       # all branches

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch filename' HEAD

from Github


git remote add upstream
git fetch upstream
git checkout master
git rebase upstream/master
git push -f origin master


Submodules treat the two projects as separate yet still be able to use one from within the other.

Github API

Download by tag

curl -sSL \
    | jq '.[0].zipball_url' | xargs -t wget -O

curl Github

curl -H 'Authorization: token INSERT_ACCESS_TOKEN_HERE' \
    -H 'Accept: application/vnd.github.v3.raw' -O -L \

Query latest release

curl -sSL \
    | jq '.zipball_url' | xargs -t wget -O


check watchers:{user}/{project}/watchers

Self-host git servers

Go: Go: Ruby:


curl -L .html to page, etc: .js CDN: .ipynb fast open: Code search: download:

Last updated