Handy git commands
Remove a file from versioning without deleting:
git rm --cached blah.tmp
legit has simplified feature branch workflows.
Subtrees
creatin':
git fetch remote branch
git subtree add --prefix=subdir remote branch --squash
updatin':
git fetch remote branch
git subtree pull --prefix=subdir remote branch --squash
git subtree push --prefix=subdir remote branch --squash
Rebasin' despite 'em is slow and involved
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
Editing history
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
I think bfg also does this. There is also native support for that:
git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch unwanted_files'open .
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
Splitting 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
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
Content-specific diffing
jupyter diffing and merging is painful. Workaround: nbdime provides diffing and merging for notebooks. It has git integration:
nbdime config-git --enable --global
git-latexdiff, is the same for LaTeX.
Decent GUIs
See Git GUIs.