git cribsheet

  • git reset -- <filename>
  • git checkout -- <filename>
  • git fetch
  • git checkout <branch>
  • git reset --hard origin/<branch>

This is a specific form of git reset --hard <commit> which resets your current branch to <commit>. origin/<branch> here refers to the HEAD commit of that branch at origin.

  • git revert ref_spec

Git revert undoes a single specified commit, making the changes necessary to do so at the HEAD of your current branch.

  • git checkout --track origin/remote_branch_name

Local branches

  • git branch -d <branch_name>

    -D to force deletion in the presence of local-only changes

Remote branches

  • git push -d origin <branch>

    (Substitute origin for a different remote name if required).

Obsolete tracking branches

  • git remote prune origin
  • git branch -vv | grep ": gone]" | cut -c-34 | awk '{print "git branch -D "$0}'
  • git diff --name-only --diff-filter=U

Show unmerged files in the diff between the working tree and the index (staging area for next commit).

git has three config files. In Windows:

  • system-wide (“system”) – gitconfig in the git install folder's mingw64\etc subdirectory (probably C:\Program Files\Git\mingw64\etc)
  • per-user (“global”) – .gitconfig in the root of the user's local profile
  • per-repo (“local”) – config in the repo's .git folder

Settings are overridden by values in more narrowly-scoped config (e.g. if the same property is set at user and repo level, the repo level takes precedence).

Can't find them?

Inspect properties to see where their values are set:

  • git config --list --show-origin

or just edit them (using the configured editor) via the command line:

  • git config --edit --system
  • git config --edit --global
  • git config --edit --local


In Git for Windows, by default the mighty vim. If that's not your cup of tea:

  • git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

Terminal colours

Here's a possible config setup (thanks Nathan Hoad!)

  ui = auto
[color "branch"]
  current = yellow reverse
  local = yellow
  remote = green
[color "diff"]
  meta = yellow bold
  frag = magenta bold
  old = red bold
  new = green bold
[color "status"]
  added = green bold
  changed = yellow bold
  untracked = magenta bold

To set these up via the command line (e.g. for current branch as above):

  • git config --global color.branch.current "yellow reverse"

Unable to get local issuer certificate

Long file names


Git for Windows compiled with msys has a limit of 260 characters for a filename – this is a limitation of msys, not Git. (Git's filename length limit is 4096 characters. Work around this by setting core.longpaths to true:

git config --system core.longpaths true

  1. Go to your forked repo

  2. Pull requests → New pull request. This compares your fork to its origin as if to merge it back to its originating repo.

  3. Change the base repo to be your fork. This turns it into a branch comparison within the fork – click compare across forks to be able to see the originating repo again.

  4. Change the head repo to the originating repo. You might need to wait for the screen to refresh if the originating repo has moved on a lot.

  5. Create the pull request and merge it