As far as this is a blog, I'm uploading assorted tech notes. More content is more reason to read. Or from another angle, a dry list of out-of-date software projects is fairly pointless. My personal world is mostly targeted on what I have time to achieve. This means in some places I am myopic on a particular tech tree. Broad overviews should help perspective.


Source control is necessary for all long term projects, and again for parallel development projects. There are a variety of tools to do this, but basically they add data integrity mechanisms to text files (like SQL engines do).
Git is a tool for massively concurrent software development. It scales better than svn (you may wish to read “the redbean book”), as its structured differently. It runs abit faster for some operations. It is du jour, and originally created by Linus Torvalds. It is massively better than CVS or RCS in my opinion. This is due to the more complicated design model, which matches current large projects. There is another DRCS called Mercurial, which I have yet to use. This is better documented in this book. Diligence will make me list other operating systems, Microsoft have a VSS product, although the wiki article is interesting. This looks like a better multi-developer tool source-vault. Alternatively, this is a frontend for traditional CLI interfaces.
For a more detailed look on the options, see this massive list. Discussions on tools are useful 1, 2.


There are alot of “introduction to GIT” articles on the web. It seems pointless to duplicate anyone else work. Please read some of the following :


For normal operating systems, I would recommend using your package manager, same as normal. If you use ms Windows, GIT may be acquired from git-scm or a windows specific build. Apple Mac should be able to use normal tools, or otherwise it is available. If you are developing from a phone, it looks like it necessary to use the web interface.

To publicly host your GIT backed projects one may use:


Methods for useful features that are omitted from the above articles.

Basic Note: Create a new branch with older data (like a symlink)

   git checkout -b $name $changeid

Basic note: create a branch with a different remote name (for those of us with spelling issues)

   git checkout $myBrnachName 
   git push $remoteRepo $myBranchName
   # in many cases $remoteRepo will be origin, but it doesn't need to be.

List changed files since branch creation

   git cherry $remoteRepo $branchName
   git diff --name-only $firstListedId $lastListedId
   # I think this could be scripted to extract the first and last ids out, the do the second call automatically.

List change set since branch creation

   git cherry $remoteRepo $currentBranch
   git diff $firstListedId $lastListedId

A method to fix annoying spelling issues.

   git commit $file -m “i have aspellidg drgdrgd "
   # oops
   git reset --soft HEAD^
   git commit $file -m “I can now spell properly."

Force change branch, because its faster than deleting random test code.
* Courtesy of J van Buskirk.

   git checkout -f $branchName

Delete unneeded branches (from the local side).

   # test obviously
   git remote prune origin --dry-run
   # update remote data
   git remote prune origin 
   # delete local branch
   git branch -d <branch_name>
   git remote show public

Tidy up the local repo, including directories

   # -n does a dry run first
   git clean -fdn
   git clean -fd

Put a branch upto the server with a different name.

   git push -u origin $localName:$niceName

Detect branches that have been merged into the trunk (so may be deleted)

   # Assuming you want comparison to the master branch,
   git branch --merged master
   # comparison to current branch
   git branch --merged

Allow upload when you have many server certs keys for server interaction
   # if ssh-add -l reports a list of keys, which don't include your repo cert, you can't upload via SSH.
   # Either set your git remote to HTTPS, or
   export GIT_SSH_COMMAND=“ssh -o PreferredAuthentications=password”
   # requires gt > 2.3, but new git is generally better.

Allow upload when you want to use a client cert, but be using ssh-agent for server work.
Combine this with a second “deploy account” in git which is readonly, and its quite useful.
   # if ssh-add -l reports a list of keys, which don't include your repo cert
   export GIT_SSH_COMMAND=“ssh -i ~/.ssh/my_private_key_rsa -o IdentitiesOnly=yes” 
   # requires gt > 2.3, but new git is generally better.

   # to diff between branches, WITHOUT WHITESPACE
   git diff -w --word-diff-regex=[^[:space:]] $branch1 $branch2
   # or, trivial extension, per file  
   git diff -w --word-diff-regex=[^[:space:]] $branch1 $branch2 -- $file

NSFW, but useful, pls read read 3.
A list of useful things, 4

This list will be updated. I am using GIT everyday, but mostly routine.

My development model with GIT for the iceline project is much simpler than this, although I will do things like I do at work, when other people are involved. I only upload to the GIT server features that have completed testing, and as I am the only creator, there can't be any conflicts.