bzr: ERROR: These branches have diverged. Use the missing command to see how. Use the merge command to reconcile them.but you don't have time to do a merge, and wait for the (reliably agonizingly slow) network round trip to negotiate with the server about what the latest revision is - the train's about to leave, or you're late for your flight, or the cafe is closing and you need to shut your laptop right now. Sadness! You continue to work on a diverged branch and merge later. Which is a shame, because mechanically dealing with merge conflicts or just making sure the tests still pass after what looks like a trivial merge is exactly the sort of thing which is convenient to do when you're stuck waiting at a network-access-free bus stop.
As it turns out, Bazaar has actually already done all the hard work necessary for you to just go ahead and do that merge when you get to your potentially non-networked destination. The diverged revisions have already been pulled into your branch and are just sitting there, waiting to be merged, but you can't see them. The 'bzrtools' plugin provides the 'heads' command, which you can use to reveal the previously invisible revision. You can then just 'merge .' instead of merging from your usual pull location, as long as you specify the appropriate revision.
To demonstrate, here's a transcript of a sample session which simulates this common problem:
First, set up a branch:
you@computer:~$ mkdir tmp you@computer:~$ cd tmp you@computer:~/tmp$ mkdir a you@computer:~/tmp$ cd a you@computer:~/tmp/a$ bzr init Created a standalone tree (format: 2a) you@computer:~/tmp/a$ touch initial.txt you@computer:~/tmp/a$ bzr add adding initial.txt you@computer:~/tmp/a$ bzr ci -m "inital revision" Committing to: /Domicile/glyph/tmp/a/ added initial.txt Committed revision 1.We'll call 'a' the 'server' branch. Next, let's make a branch that represents the 'on the go' branch, your local working copy:
you@computer:~/tmp/a$ cd .. you@computer:~/tmp$ bzr get a b Branched 1 revision(s).Now, it's time to diverge. Let's give each branch its own revision.
you@computer:~/tmp$ cd a you@computer:~/tmp/a$ touch a.txt you@computer:~/tmp/a$ bzr add badding a.txt zyou@computer:~/tmp/a$ bzr ci -m 'revision from a' Committing to: /Domicile/glyph/tmp/a/ added a.txt Committed revision 2. you@computer:~/tmp/a$ cd ../b/ you@computer:~/tmp/b$ touch b.txt you@computer:~/tmp/b$ bzr add adding b.txt you@computer:~/tmp/b$ bzr ci -m 'revision from b' Committing to: /Domicile/glyph/tmp/b/ added b.txt Committed revision 2.Now, it's time to get on that sad, wifi-free train. Let's make sure we're up to date with 'a' first...
you@computer:~/tmp/b$ bzr pull ../a bzr: ERROR: These branches have diverged. Use the missing command to see how. Use the merge command to reconcile them. [Error: 3]Oh no! But, here comes 'bzr heads' to the rescue:
you@computer:~/tmp/b$ bzr heads --dead HEAD: revision-id: <strong>you@computer-123456</strong> (dead) committer: You <you@computer> branch nick: a timestamp: now-ish message: revision from aNow you know what the revision ID of the already-pulled-but-not-visible revision is - the tip of 'a', in other words. Now you just need to ask 'b' to merge it:
you@computer:~/tmp/b$ bzr merge . -r <strong>you@computer-123456</strong> +N a.txt All changes applied successfully. you@computer:~/tmp/b$ bzr ci -m 'merge from a' Committing to: /Domicile/glyph/tmp/b/ added a.txt Committed revision 3.Done! And, as you can see when you get back to your cozy 10gigE fiber connection at home, or whatever you happen to have, you see that the revision you've merged lines up neatly with 'a':
you@computer:~/tmp/b$ bzr pull ../a No revisions to pull. you@computer:~/tmp/b$Et voila. I hope this saves somebody some time when dealing with failed pulls.
For those of you who may be curious about the use-case, if you don't have it: I rarely encounter this with actual codebases I work on, as I tend to have a local trunk mirror, and features are neatly segregated into branches. It comes up more frequently in my personal configuration-files repository, where I make little changes to my desktop, little changes to my laptop, and then want to get out the door quickly with the latest merged copy. I was so happy when #bzr on freenode (thanks, spiv!) solved this problem for me that I just had to share.
No comments:
Post a Comment