- Handy git commands
- delete remote branch
- Filters: smudge and clean,
- Subtrees/submodules/subprojects/subdirs/subterranean lizard overlords
- Deleting all tags
- Not repeating yourself during merges
- Importing some files across a branch
- Garbage collecting
- Editing history
- Making it work with a broken-permissioned FS
- Detecting if there are changes to commit
- Emergency commit
- Content-specific diffing
- Decent GUIs
- Which repo am I in?
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
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,
Subtrees/submodules/subprojects/subdirs/subterranean lizard overlords
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. Alternatively there are submodules, which have various complications.
Alternatively there is the
subtrac system, which I have not yet used.
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
Pruning off a sub-project
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 popd 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 -- \ --all
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.
subtracis a helper tool that makes it easier to keep track of your git submodule contents. It collects the entire contents of the entire history of all your submodules (recursively) into a separate git branch, which can be pushed, pulled, forked, and merged however you want.
Download a sub-directory from a git tree
This works for github at least. I think anything running
- replace tree/master => trunk
- svn co the new url
svn co https://github.com/buckyroberts/Source-Code-from-Tutorials/trunk/Python
Not repeating yourself during merges
git config --global rerere.enabled true git config --global rerere.autoupdate true
Importing some files across a branch
git checkout my_branch -- my_file/
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
Cleaning out all big files
bfg does that:
git clone --mirror git://example.com/some-big-repo.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
bfg also does this. There is also native support:
git filter-branch -f \ --index-filter '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
if output=$(git status --porcelain) && [ -z "$output" ]; then # Working directory clean else # Uncommitted changes fi
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
#!/usr/bin/env bash if output=$(git status --porcelain) && [ -z "$output" ]; then echo "nothing to commit" else git add --all && git commit -m bang fi git pull && git push
For sanity in git+jupyter, see
See Git GUIs.
Which repo am I in?
For fish and bash shell, see bash-git-prompt.