While helping a friend with a git problem today, I had to introduce a branch that needed to be totally separate from the master branch. The contents of this branch really had a different origin from what had been developed on the master branch, but they were going to be merged into the master branch at a later time.
I remembered from reading John Wiegley's Git from the bottom up how branches are essentially a label to a commit that follows a certain convention and how a commit is tied to a tree of files and, optionally to parent commits. We went to create a parentless commit to the existing repository using git's plumbing:
So we got rid of all files in the index ...
$ git rm -rf . ... extracted directories and files from a tarball, added those to the index ...
$ git add . ... and created a tree object ...
$ git write-tree (git-write-tree told us the sha1sum of the created tree object.)
Then, We committed the tree, without specifying parent commits...
$ echo "Imported project foo" | git commit-tree $TREE (git-commit-tree told us the sha1sum of the created commit object.)
... and created a new branch that points to our newly created commit.
$ git update-ref refs/heads/other-branch $COMMIT Finally, we returned to the master branch to continue work there.
$ git checkout -f master This seems to have worked as planned. But this is clearly not the kind of procedure I would recommend to someone who is just getting started using git, to put it mildly. Is there an easier way of creating a new branch that is entirely unrelated to everything that has happened in the repository so far?