Git is remarkable for how smooth, fast, and tiny it is as a command-line application.
Because of some as-yet unarticulated conservation law, this means that all the GUIs for it are clunky, slow, and bloated. To go from the magically simple experience of git, to one with better visualisation, you must sacrifice time upon the altar of thread locks.
I am intermittently auditioning smartgit after being dissatisfied with the gigabyte of RAM that GitKraken and SourceTree demand to do basic stuff. Free for non-commerical use. (closed-source, USD99/yr for updates, free for non-commercial use)
UPDATE: Apparently I deleted it for some reason too boring to remember. YMMV.
gitkraken seems to be the sleekest and hippest, and runs everywhere. It also has the least horribly broken visualisation. It uses gigantic amounts of RAM. Rebase support is weak. (closed-source, USD60/yr, free for non-commercial use)
Sourcetree (closed source, free) is an adequate client on Windows and OSX, although it also uses gigantic amounts of RAM, and is slow in a particularly irritating way where the GUI controls keep on vanishing just as you are about to click on them. This could be improved by rebranding as a game of git-whack-a-mole, but my support tickets about this are going unanswered. On the plus side, it also supports mercurial, which is nice if increasingly irrelevant. Powerful rebase support, but it might crash half way through the rebase. Memory usage and responsiveness can be fixed by restarting it every hour or two.
git-cola is open-source, in python. Haven’t used.
giggle (open-source, Linux/GTK only) seems to be purely a repository viewer, but that’s actually done really badly generally, so this plus git CLI might be a sweet combination.
sparkleshare is designed for file syncing for designers, not versioning code for coders, but is also effectively a neat git GUI, with attention from designers, which as I have mentioned is a bit of a weak spot, in the bulk of offerings.
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
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
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
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 .
e.g. you are editing a git repo on NTFS via Linux and things are silly.
git config core.filemode false
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