The Living Thing / Notebooks :

Git tricks

Usefulness: 🔧 🔧
Novelty: 💡
Uncertainty: 🤪 🤪 🤪
Incompleteness: 🚧 🚧 🚧

credit: Kerryn Wood

My own git notes. See also the more universally acclaimed classic git tips.

See the fastai masterclass for many more handy helpful tips/links/scripts/recommendations.

Handy git commands

Remove a file from versioning without deleting:

git rm --cached blah.tmp

Ignore macOS .DS_Store files

echo .DS_Store >> .gitignore_global
git config --global core.excludesfile $HOME/.gitignore_global

delete remote branch

git push <remote_name> --delete <branch_name>

legit simplifies feature branch workflows.

Filters: smudge and clean, .gitattr

Long story. A useful one is stripping crap from jupyter notebooks.


Sub-projects inside other projects? External projects? The simplest way of integrating external projects is as subtrees. Once this is set up you can mostly ignore them.

Splicing a subtree onto a project


git fetch remote branch
git subtree add --prefix=subdir remote branch --squash


git fetch remote branch
git subtree pull --prefix=subdir remote branch --squash
git subtree push --prefix=subdir remote branch --squash

Con: Rebasin’ despite ’em is slow and involved.

Pruning off a sub-project

Use subtree split to prise out one chunk. It has a few wrinkles but is fast and easy.

pushd superproject
git subtree split -P project_subdir -b project_branch
mkdir project
pushd project
git init
git pull ../superproject project_branch

Alternatively, to comprehensively rewrite history to exclude everything outside a subdir:

pushd superproject
cd ..
git clone superproject subproject
pushd subproject
git filter-branch \
    --subdirectory-filter project_subdir \
    --prune-empty -- \


Include external projects as separate repositories within a repository is also possible, but I won’t document it here, since it’s well documented elsewhere and anyway I’m not a fan it always seems to cause many things to go wrong for me if I am not highly disciplined.

Download a sub-directory from a git tree

This works for github at least. I think anything running git-svn?

Heinous hack

  1. replace tree/master => trunk
  2. svn co the new url
svn co

Deleting all tags

git tag -l | xargs -I %% git push -v origin :refs/tags/%%
git tag -l | xargs git tag -d && git fetch -t

Not repeating yourself during merges

git rerere automates this:

git config --global rerere.enabled true
git config --global rerere.autoupdate true

Importing some files across a branch

git checkout my_branch -- my_file/

Garbage collecting

In brief, this will purge a lot of stuff from a constipated repo in emergencies:

git reflog expire --expire=now --all && git gc --prune=now

In-depth explanation.

Editing history

Cleaning out all big files

bfg does that:

git clone --mirror git://
java -jar bfg.jar --strip-blobs-bigger-than 10M some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

Deleting specific things

I think bfg also does this. There is also native support:

git filter-branch -f \
    'git rm -r --cached --ignore-unmatch unwanted_files'

Making it work with a broken-permissioned FS

e.g. you are editing a git repo on NTFS via Linux and things are silly.

git config core.filemode false

Detecting if there are changes to commit

Thomas Nyman:

if output=$(git status --porcelain) && [ -z "$output" ]; then
  # Working directory clean
  # Uncommitted changes

Emergency commit

Oh crap I’m leaving the office in a hurry and I just need to get my work into git ASAP for continuing on another computer. I don’t care about sensible commit messages because I am on my own private branch.

I put this little script in a file called gitbang to automate the most common case.

#!/usr/bin/env bash
if output=$(git status --porcelain) && [ -z "$output" ]; then
  echo "nothing to commit"
  git add --all && git commit -m bang
git pull && git push

Content-specific diffing

Tools such as git-latexdiff provide custom diffing for, in this case, LaTeX code.


For sanity in git+jupyter, see jupyter.

Decent GUIs

See Git GUIs.

Which repo am I in?

For fish and bash shell, see bash-git-prompt.