Mercurial - Ben Pitts
1 / 25

History Structure Git Comparison File Storage File Tracking Staging Queues (MQ) Merge Tools - PowerPoint PPT Presentation

  • Uploaded on

Hg. History Structure Git Comparison File Storage File Tracking Staging Queues (MQ) Merge Tools Interfaces. Mercurial / Git History. Bitmover's BitKeeper Proprietary distributed revision control system Used by Linux Kernel project for three years until…

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
Download Presentation

PowerPoint Slideshow about ' History Structure Git Comparison File Storage File Tracking Staging Queues (MQ) Merge Tools' - xenia

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Mercurial - Ben Pitts




Git Comparison

File Storage

File Tracking


Queues (MQ)

Merge Tools


Mercurial git history

Mercurial - Ben Pitts

Mercurial / Git History

  • Bitmover's BitKeeper

    • Proprietary distributed revision control system

    • Used by Linux Kernel project for three years until…

    • April 2005 Bitmover CEO Larry McVoy pulls the free version of BitKeeper completely.

  • Linus Torvalds

    • Leaves kernel project to create the next kernel RVS

    • Two months later Git is born and hosts the kernel project

  • Matt Mackall simultaneously creates Mercurial

    "Mercurial is very good, but Git is better.“

    Linus Torvalds

    “It largely comes down to taste. I guess some people just have no taste, but if Git makes them happy, I won't try to stop them.”

    Matt Mackall


Mercurial - Ben Pitts


  • Project named Mercurial

  • Application named Hg (Mercury)

  • Open Source (GPL2)


  • Mercurial is written in Python

  • Some machine language components

  • Notable users:

    • Mozilla, Python, NetBeans, OpenOffice, OpenJDK, rpm

  • Free hosting:


  • Mercurial structure filesystem

    Mercurial - Ben Pitts

    Mercurial Structure - Filesystem


    • Working directory

    • Represents one revision

    • Refreshed by 'hg update'


    List of ignored files

    Repository folder





    Tags are global pointers to changesets, like Git

    .hgignore and .hgtagskept in the working directory for version control.

    • A tag will always point to a revision older than the one that committed the tag.

    • Cloning from a tag will retrieve a repository that doesn't have the tag you cloned from.


    • Repository store

    • File snapshots

    • Manifest of files

    • Changesets of file deltas

    • Logs of all revisions

    Mercurial structure repository

    Mercurial - Ben Pitts

    Mercurial Structure – Repository




    • Revisions form a directed acyclic graph

    • Revisions stored as keyframed deltas

    • A revision is a snapshot of a commit.

    • The last revision in the chain is a head

      • There can be any number of heads

      • Heads can be merged two at a time into new revisions.






    Mercurial vs git

    Mercurial - Ben Pitts

    Mercurial vs. Git

    • Largely equivalent to Git

      • Most functionality identical between systems

      • Differences in implementation and approach

      • Discrepancies resolved by extensions

    • hg-git

      • Mercurial plugin two-way bridge between Mercurial and Git

      • Allows Mercurial repository to push/pull with Git repositories


    • Full command comparison at


    Mercurial vs git extensions

    Mercurial - Ben Pitts

    Mercurial vs. Git Extensions

    Extensions provide feature parity between Git and Hg

    • Git Stash / Mercurial Attic or Shelve

      • Set aside working environment for later

        • Side commit of working directory

        • Git Index / Mercurial Queue[s]

    Mercurial vs git staging

    Mercurial - Ben Pitts

    Mercurial vs. Git Staging

    git commit

    git add

    Working Directory

    Git Repo


    • Git explicitly identifies what files to commit through an Index, or staging area

    • Mercurial treats the working directory as a snapshot of the commit, automatically managing which files are modified and need to be included.

    • Mercurial Queues extension can be used for more atomic control over commits, as well as the ability to push and pop patches in a system similar to Quilt.

    hg commit

    Hg Repo

    Working Directory

    Mercurial file storage

    Mercurial - Ben Pitts

    Mercurial File Storage

    File Storage

    • Stores a snapshot (instance) of the current heads

    • Stores changesets containing commit deltas

    • Conflates deltas into keyframes

      • Compress deltas

      • Increase random access performance


    • Files stored via compress (zip)

      • Algorithm balances compression with performance

    • Files stored raw if already compressed

      • Hg always does ‘the right thing’ when storing files.

    • HTTP transfers use bzip2

    • SSH connections use SSH built in stream compression

    Mercurial file tracking

    Mercurial - Ben Pitts

    Mercurial File Tracking

    Track files not folders

    • Empty folders not allowed

    • Only files are tracked

    • File path is created with the file and torn down after if empty

      Tracking Files

    • ‘hg add’ – Add file[s] to the repository, and to the next commit

    • ‘hg addremove’ – Add all new files, removes missing files

    • ‘hg remove’ – Stop tracking history, file is deleted from working directory.

    • The complete history of the file is still stored, forever.

      • No garbage collection

    • Mercurial will track a new file with the same name as a separate entity.

    Mercurial history

    Mercurial - Ben Pitts

    Mercurial History

    • What is past stays in the past, history moves forward.

    • Mercurial an append-only philosophy and makes it difficult to alter the history of commits

    • Avoids pitfalls of allowing history rewriting

    • Trades off flexibility

    • Guaranteed atomicity of transactions

    • Repository unlocked for reading at all times

    Mercurial vs git rebasing

    Mercurial - Ben Pitts

    Mercurial vs. Git Rebasing

    • Git is designed to allow the graph to be modified freely.

    • Mercurial is designed to keep the graph moving forward.

    • Rewriting the commit graph is not allowed in Mercurial.

    • Mercurial Rebase Extension

      • Allows rebasing uncommitted changes

        • ‘hg pull’ a new head.

        • ‘hg rebase’ your changes onto the head.

      • Fails if conflicts detected

      • Can also be done as part of a pull

        • ‘hg pull –rebase’

    • Hg's Rebase will not allow

      • rebasing to your own ancestor

      • rebasing to merge revision with external parents.

    Mercurial queues mq

    Mercurial - Ben Pitts

    Mercurial Queues (MQ)

    • To use a Git Index style layer, create a single patch

      • 'hg qnewpatchname‘ – Create a single patch

      • ‘hg qrefresh’ – Record changes into the patch

      • 'hg qfinish‘ – Finalize the patch

    • The Queue can contain multiple patches

    • More flexible than Git's single Index

    • Git is capable of handling patches too:

      • StGIT


      • Guilt


    • These are scripts layered over Git

    • MQ is an integral extension to Hg

    Mercurial queues patches

    Mercurial - Ben Pitts

    Mercurial Queues - Patches


    Patch 1

    ‘UI Tweak’

    Patch 1


    Working Directory

    • ‘hg qpop’ and ‘hg qpush’ - Navigate up and down the patch chain

    • ‘hg refresh’ – Save changes into current patch

    • Changes in the commit can be separated by feature or section and tracked individually.

    • MQ also supports multiple parallel queues.

      • 'hg qqueue -c [queue name]' creates a queue.

      • 'hg qqueue [queue name]' switches between active queues

    Mercurial queues versioning patches

    Mercurial - Ben Pitts

    Mercurial Queues – Versioning Patches

    • Patches are kept in plaintext in the repository

      • Single queue patches stored in:

        • /.hg/patches/[patchname]/

      • Multiqueue patches stored in:

        • /.hg/patches-[queuename]/[patchname]/

    • Creating a Mercurial repository inside these folders expands this intermediate area into a versioned repository.

      • Share queues with other people to allow others to look at your patch in progress before it is committed.

      • Collaborate on components of the code at a more local level before finalizing the overall commit.

    Mercurial branching

    Mercurial - Ben Pitts

    Mercurial Branching

    • Git creates branches by attaching labels to commits and growing the tree.

    • In Mercurial branching can be done internally, but cloning a repository is always preferred.

    • Cloning is safer, more modular, easy to discard.

    • If cloning locally, Mercurial uses hardlinks to files

    Mercurial branching1

    Mercurial - Ben Pitts

    Mercurial Branching

    Mercurial supports named branching

    • Named branches exist in a global namespace.

    • Useful for team and project organization

      Keep a gold, beta, and alpha head.

      As QA tests, the heads are moved up the chain.

      Mercurial still doesn’t let you change history, so…

    • You can never delete or rename a named branch.

      (Of course you can, but it's not recommended.)

    Mercurial branching2

    Mercurial - Ben Pitts

    Mercurial Branching

    Mercurial Bookmarks Extension

    • Comes in the box

    • Allows commits to be named less permenantly

    • Bookmarks are pointers into the commit graph

      • Can be renamed, nested and deleted at will

    • Bookmarks may be pushed and pulled between repositories

      • Global namespace still applies.

    Mercurial merge tools internal

    Mercurial - Ben Pitts

    Mercurial Merge Tools - Internal

    • internal:merge

      • Traditional merge with conflict markers baked into the file

      • ‘hg resolve’ needed before ‘hg commit’ is allowed

    • internal:dump

      • Creates three versions of the files to be merged manually: local, other and base

      • For the file a.txt, the conflict files will named "a.txt.local", "a.txt.other" and "a.txt.base“

    • internal:fail

      • Marks unmerged files as unresolved, ‘hg resolve’ needed

    • internal:local

      • Uses the local version of files as the merged version

    • internal:other

      • Uses the other version of files as the merged version

    • internal:prompt

      • Asks the user to keep local or other as the merged version

    Mercurial merge tools external

    Mercurial - Ben Pitts

    Mercurial Merge Tools - External

    • Merge tools are selected in /.hg/hgrc


      mymergetool.priority= 100

      mymergetool.premerge= False

      mymergetool.args= $local $other $base -o $output

      myimgmerge =


      **.jpg = myimgmerge

      **.exe = internal:fail

    Mercurial merge tools external1

    Mercurial - Ben Pitts

    Mercurial Merge Tools - External

    • Tool Arguments

      • $output – Where the merge will end up

      • $local- Unmerged local changes

      • $base - Revision from the merge ancestor

      • $other - Second parent revision

    • Tool Options

      • .args - The arguments to pass the merge tool

      • .premerge=False – Don’t first attempt internal merge (defaults to True)

      • .executable – Path of merge tool

      • .binary – Does the merge tool support binary files?

      • .symlinks– Does the merge tool support symlinks?

      • .gui– Requires a GUI, interactive merge

      • .priority - Priority of this merge tool (0-100)

    Mercurial merge tools external2

    Mercurial - Ben Pitts

    Mercurial Merge Tools - External

    Interactive merging tools are plentiful

    • KDiff3

      • Merge GUI

      • Packaged with Hg

    • Meld

      • Merge GUI

      • Linux/Mac/Win


    • Diffuse

      • Text based interactive merge tool

      • Python


    Mercurial interfaces

    Mercurial - Ben Pitts

    Mercurial Interfaces

    • SourceTree

      • Free Git/Hg GUI for Win/Mac


    • MacHg

      • Free Hg GUI for Mac


    • TortoiseHg

      • Free file browser integration, Windows and Gnome/Nautilus


    • EasyHg

      • Simple free Hg GUI for Linux/Mac/Win


    Mercurial integration

    Mercurial - Ben Pitts

    Mercurial Integration

    • Eclipse

      • Mercurial Eclipse plugin


    • NetBeans

      • Supported out of the box

    • Visual Studio

      • HgSccPackageextension


    • Ant

      • ANT4HG


    • Maven

      • Integrated via scm:hg namespace

    Mercurial - Ben Pitts



    Benjamin Pitts

    Computer Science M.S. Student

    Old Dominion University