DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports Events Over 2 million developers have joined DZone. Join Today! Thanks for visiting DZone today,
Edit Profile Manage Email Subscriptions Moderation Admin Console How to Post to DZone Article Submission Guidelines
View Profile
Sign Out
Refcards
Trend Reports
Events
Zones
Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones AWS Cloud
by AWS Developer Relations
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones
AWS Cloud
by AWS Developer Relations
  1. DZone
  2. Testing, Deployment, and Maintenance
  3. Deployment
  4. Mercurial Guide

Mercurial Guide

Liran Mendelovich user avatar by
Liran Mendelovich
·
Jul. 21, 10 · Interview
Like (0)
Save
Tweet
Share
18.80K Views

Join the DZone community and get the full member experience.

Join For Free
Version 1.41, 29/03/2013 

Short and simple Mercurial Guide / Tutorial - for working with a plug-in for Eclipse

Mercurial is a distributed version control system. Each user has revisions in their local repository. There is also one shared repository, typically hosted on the internet. Mercurial is convenient for teamworking, as well as working alone where you can easily roll back to an older version of the project.

Important: You should read the entire guide first, before you start working with Mercurial, especially the working rules at the end. Also, it's a good idea to save a manual backup of your files (although not required)

There are many ways to use Mercurial. In this article we'll explain how to use Mercurial in a Java project with a plug-in for Eclipse.

Installing Mercurial, And Eclipse Plug-In

Windows
Download Mercurial from http://mercurial.selenic.com/downloads/, install, and verify that the second option is checked. Add the installation path to the search path

Hit “Finish” and you’re ready. Open “Cmd” and type:

hg --version
Now you’re done. Mercurial is installed on Windows.(Now you have verified that you can use it from command prompt on Windows)
Ubuntu(Linux)
sudo apt-get install mercurial hg --version
Eclipse Plug-In In Eclipse, go to Help/Install New Software and install from the  following update site:http://cbes.javaforge.com/update



It can take a while. Also, if there is a problem at the intallation, you can uncheck the second option and try again.
If there is sill a problem during installation, download com.vectrace.MercurialEclipse_xxx.jar from http://javaforge.com/dir/76467, close Eclipse, put in the folder you installed Eclipse to, under plugins, e.g. Eclipse\plugins, and start Eclipse again. It will be installed.

Now we'll see how to work with Mercurial, broken into two parts: for the user who initially created the project, and for the user(s) who are also working with this project.

For the user who initially created the project

  • Create a new Java project in Eclipse, hit right mouse click on it: Team /Share Project…  This will cause a star to appear next to the project

    and confirm.
  • Create a repository on the internet, for example on one of these sites:
    http://www.selenic.com/mercurial/wiki/index.cgi/MercurialHosting
    (Google code, Codeplex, etc', notice the clone address that the sites give you)

Now we'll see an example of using the repository.

Create a class and write in something, i.e. "try1" as a comment. Now right click on Project/Team/Commit.



A window will open, write your commit message (important ! So when switching to another revision, the changes will be clear quickly), check all the files, and confirm. Now the revision is saved on the local repository on your computer.

Again, right click on  project, click Team/Push, and enter the clone project address from the internet repository, with your username and password and confirm.

Now the revisions from your computer are uploaded to the shared repository on the internet.

Now your project teammate, who also works on the project, did some changes of other files from the project, and committed them to a newer revision (he also pushed his changes). You want these changes at your computer as well.

Right click on the project, and click Team/Pull.



Check update (checked by default), this is recommended. Now the revision from the internet repository is downloaded to your local repository, and if there are no conflicts (e.g. working on same file at the same time), all the needed files will be updated. If wanted - do commit.

For Users Working on an Existing Project

The more convenient option, but which causes the project hierarchy (on the left) to look a bit different.Using the File / Import / Mercurial / Clone repository using Mercurial.


Type in the clone project address, and click confirm.

There are a lot of options under the Team menu, such as options for branches, and merge, which can be problematic (see below), but necessary.

Important Working Rules

Without maintaining these rules, working with Mercurial can be very frustrating and cause problems, mainly when trying to merge. In fact, the merge option can still be problematic even when maintaining these rules!

Do not create a situation where more than one user is working on the same file on the same time (What will happened to this file on merge and which file will be chosen ?)

Short explanations of actions:

Commit
Save the changes you made on the revision to your local repository.
Notice you should pull and update before a commit. Otherwise, if there was a commit by a different user after your last pull, and before your commit - when you push you will see that your commit created another head - a merge will be necessary (don't force push in this case).

Push
Upload all the revisions from your local repository to the internet.

Pull
Note, this meaning is just for pull, without checking the merge/update option, no merge afterwards
Download all revisions that other users have uploaded to your local repository from the server (shared repository). If the merge option is chosen, it merges your revision with the latest changes.
If update (recommended) is checked, the changes from the repository will take place at your computer. You should update before start working.

Switch to
Make sure to commit first!

Switches to another revision. This is a very powerful option, which can be used a lot. When you are at a certain revision, and wants to see an older one as is - just do switch to to the wanted revision, and you will see it. Make sure though, that the next time you do commit, it's from the tip(last) revision.

Merge
Choose the required revision, usually the last one that you didn't upload, and merge the changes with your revisions.

Each time when you work, before you start changing things, if you do not have the last revision – pull and then merge with the last revision.

When you have made your changes, commit and push. It's recommended to do this from time to time.

When you push or pull, you can probably check both the option 'abort when timeout occurs.'

Backout
With backout you can reverse changes that have been committed earlier. Meaning, when you want to switch to an older revision, so that older revision will become the new tip revision, the newest revision. It can be useful if you want to discard the changes of some of the last revisions (while keeping them at the repository).
To do this: team -> undo -> backout, and choose the next revision, the one revision after the revision you want to switch to. So the parent of the revision you chose will become the new one(without creating a new unwanted head, like it can happend if you commit from an older revision). You can also leave the merge option checked, and then merge some of the changes.


Branching

Introduction

A branch is like a collection of revisions, a linear sequence of consecutive changesets, a copy of the main source. And it is targeted not to be committed onto the main source.

Uses, for example:

- If you want to try changing some classes, but not sure it will work, you can try,

and if you want to revert, you do not have to remember all the changes you have made - just return to the main branch. This way, you can commit a few times to the branch, without affecting the main source.

- A Software developer at a developing team can work on his branch, and when he finishes, the team leader can check his work before it is merged onto the main source.

- * You created a system for something. Now there is a demand for a similar one, but with slightly changes. So instead of creating another copy of the whole source - create a branch for it.

  * This is sometimes not needed, depends on the design of the system.

Creating branches

There are several ways; I will discuss branching with named branches.

I will discuss a case where there is a main source, and branches under it, with no sub-branches of them. But this should not be very different.

If it used under the same repository, it adds a new head. So the space that the source is taken is not doubled (correct me if I’m wrong here).

To create a branch at Eclipse: right mouse click on the project: team -> Add Branch.

Working with the branch

You can commit changes regulary as needed (right mouse click on the project: team -> commit).

Merging changes from a branch to the main source (The branch is good)

First we go back to the main branch (or someone, e.g. team leader which already at the main branch so it is not needed): right mouse click on the project: team -> switch to – branches – and choose the main branch.

right mouse click on the project: team -> merge – branches – choose the newly created branch (notice that files that have been changed at the branch will be also changed at the main branch !!! ).

Close / Remove Branch

You can close a branch for some reasons, for example:

With Mercurial, you can create a temporary branch, either for an experimental feature, or to develop a new pretty big feature when you do not want to commit to the head until it is ready, or you do not want this branch anymore.

In order to do this:
When you are on the latest revision of the branch you want to close: team -> commit -> check "Close named branch".

This will keep the branch with its revisions in repository history, but you will not see this branch in the active branches tab.

Tags

You can tag revisions for a certain project version, patch / update number etc':
team -> Tags...

More

ignore
If you want to ignore a file, so it will not be uploaded to the repository on 'commit':
Right click on the file -> team -> ignore.
It is good for example for keeping local configuration file, configured differently for each computer / environment.

If you get "crosses branches" message when trying to push
'force push' will work, but it is NOT recommended ! So it suggested for you to first merge with the head - but notice every different file - notice that you get in the end actually the files you wanted, with their content.

WEB interface for a project

Right click on the project -> team -> serve
Then go to http://localhost:8000/ (default port) / http://localhost:PORTNUMBER/ at your web browser.
Annotate
This command can be useful to see the specific lines each user wrote at a file. This command can be used from the Eclipse plug-in, but it's not so clear over there. So from the Windows command line / Linux console, enter the folder of the project, and then:
hg annotate -u -n FILENAME
or
hg annotate -u FILENAME

Hooks
Mercurial can run script/s each time a specific defined Mercurial event happens.
The script to run is defined at the file .hg/hgrc at the folder of the project. Notice that this file, and Mercurial Hooks are not revision controlled, and do not propagate. So it’s defined only on each repository separately, or only on one (or more) repository.
More information:
http://mercurial.selenic.com/wiki/Hook
http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html
Notice that some online repository sites offer an option to request an API call on each PUSH, so you might consider it instead of hooks, depends on your needs.

Archive

This is like export.
It can create a snapshot of the project at a certain revision (usually the latest).
To do this, enter the folder of the project via the command line / terminal / console, and enter the command:
hg archive ARCHIVENAME
Or to specify a revision:
hg archive -r REVISIONNUMBER ARCHIVENAM
It can also create ZIP, or other type archive files.


This can also be a version control / distributed version control guide for beginners / starters:

Version Control Guide

source control Branch (computer science) Repository (version control) Commit (data management) Merge (version control) teams Version control Eclipse Distributed version control

Opinions expressed by DZone contributors are their own.

Popular on DZone

  • How To Choose the Right Streaming Database
  • Create Spider Chart With ReactJS
  • DevOps for Developers: Continuous Integration, GitHub Actions, and Sonar Cloud
  • DevOps vs Agile: Which Approach Will Win the Battle for Efficiency?

Comments

Partner Resources

X

ABOUT US

  • About DZone
  • Send feedback
  • Careers
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 600 Park Offices Drive
  • Suite 300
  • Durham, NC 27709
  • support@dzone.com
  • +1 (919) 678-0300

Let's be friends: