Skip this Video
Download Presentation
History Structure Git Comparison File Storage File Tracking Staging Queues (MQ) Merge Tools

Loading in 2 Seconds...

play fullscreen
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 PittsMercurial / 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 PittsMercurial
    • 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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 PittsMercurial 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