So right now I’m learning Ruby on Rails, and I’m working through the book “Agile Web Development with Rails”. I’ve also decided that I want to give Mercurial a go, because I’ve read up on distributed SCM’s, and it seems like an ideal situation. I still, however, prefer to push my code remotely to my Linux VPS just incase my hard drive decides to take a dive.
So, my question is specific to branching in Mercurial. Right now I’ve got a remote repository set up and I can push changes over SSH easily (hell I even set up an Nginx FastCGI site that lets me push, too). What I’d like to do, however, is create branches for each chapter as I work on them, so I can keep a nice organized history of my progress through the book. So this is what I’m doing:
$ hg branch chapter-10 (do chapter 10 stuff) $ hg commit -m "Chapter 10 complete" $ hg update default $ hg merge chapter-10 $ hg commit -m "Merging chapter 10 into default" $ hg push
Once I execute the push statement, I get this message from Mercurial:
pushing to ssh://myserver/hg/depot searching for changes abort: push creates new remote branch 'chapter-10'! (did you forget to merge? use push -f to force)
So at this point I try to do an hg merge again, and it tells me there’s nothing to merge, which is obviously true because I just merged it. When I force the push with -f, everything seems fine, and even the web interface shows the appropriate branches.
To sum up, my question is simple: Am I doing this the right way? Is there a more appropriate way to do this with Mercurial (i.e. the “Mercurial way”)? Honestly I just want the repository to serve as a backup. I’m a fan of the distributed SCM model, but to me it feels sorta “dirty” to force pushes. Any insight is greatly appreciated! Thanks in advance.
The
push -fis the right option for your case, and there was a discussion last month to add that command when this “push creates new remote branch” warning pops up: see issue 1513.However, issue 1974 (this month) mentions some undesirable effects (not in your case though).
See this translated article to know more about creating a second head on a remote repo.
On the more general point, you can use branch if you are writing your chapter in parallel, and you want to merge them only at certain (stable) point in time
But if your writing process is more linear, you could use only one branch, and put some tags along the way.
However, should you go back to chapter 10 and add some lines, even though you already put tags 11 and 12, that would make the history harder to read. So branches are still a good idea in this case.