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 objact.)
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?