In both git and bzr, each branch you clone is a full copy of project’s history. Once you have downloaded the source control objects from the remote location (e.g. github or launchpad), you can then use your local copy of the repo to quickly create more local branches.
What if another user has code in their branch that you want to inspect or use?
In git, since it’s common to have many logical git branches in the same physical filesystem directory, the operation is conceptually a simple extension of the default workflow, where you use “git checkout” to switch between logical branches.
The conceptually simple extension of the workflow is to add the location of the remote repo to your local repo and download any potentially new objects you don’t already have.
Now you have access to the new branches, and can switch between them with “git checkout”.
In command sequences:
git remote add alice https://github.com/alice/project.git git remote update git checkout alice/new_branch
This workflow is great if project.git is very large, and you have a slow network. The remote update will only download Alice’s objects that you don’t already have, which should be minimal, comparatively speaking.
In bzr, the default workflow is to have a separate physical filesystem directory for each logical branch. It is possible to make different branches share the same physical directory with the ‘colo’ plugin, but my impression is most people don’t use it and opt for the default.
Since different bzr branches will have different directories by default, getting them to share source control objects can be trickier especially when a remote repo is involved.
Again, the use case here is to avoid having to re-download a gigantic remote branch especially when perhaps 98% of the objects are the same.
I read and re-read the `bzr branch` man page multiple times, wondering if some combination of –stacked, –use-existing-dir, –hardlink, or –bind could do this, but I ended up baffled. After some good clues from the friendly folks in the #bzr irc channel, I found this answer:
I used a variation of the second (non-accepted) answer:
bzr init-repo ../ bzr reconfigure --use-shared
I was then able to:
cd .. bzr branch lp:~alice/project/new_branch cd new_branch
The operation was very fast, as bzr downloaded only the new objects from Alice that I was missing, and that was exactly what I wanted. \o/
- When you issue “bzr init-repo ../” be sure that your parent directory does not already contain a .bzr/ directory or you might be unhappy
- Another method to accomplish something similar during “git clone” is to use the –reference switch
- I don’t know what would have happened if you just issued “bzr pull lp:~alice/project/new_branch” inside your existing branch, but my intuition tells me “probably not what you want”, as “bzr pull” tends to want to change the working state of your tree with merge commits.
- Again contrast to git, which has a “git fetch” concept that only downloads the remote objects without applying them, and leaving it up to the user to decide what to do with them.