Presentation is loading. Please wait.

Presentation is loading. Please wait.

Hg History Structure Git Comparison File Storage File Tracking Staging

Similar presentations


Presentation on theme: "Hg History Structure Git Comparison File Storage File Tracking Staging"— Presentation transcript:

1 Hg History Structure Git Comparison File Storage File Tracking Staging
Mercurial - Ben Pitts Hg History Structure Git Comparison File Storage File Tracking Staging Queues (MQ) Merge Tools Interfaces

2 Mercurial / Git History
Mercurial - Ben Pitts 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.“ “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 Bitmover's BitKeeper software is a proprietary distributed revision control system that was used most famously by the Linux kernel. April 2005, Bitmover CEO Larry McVoy pulls the free version of BitKeeper completely. Linus Torvalds stops working on the kernel to create an open source distributed revision control system to replace BitKeeper. In two months Git is born and being used to manage the kernel project. Simultaneously (though Git had "a few days' head start"), Matt Mackall announces Mercurial, named after Larry McVoy's apparently volatile temperment. "Mercurial is very good, but Git is better.“ - Linus Torvalds “As to the question of which distributed system to use, that's a lot like the cola wars: 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

3 Mercurial Mercurial is written in Python
Mercurial - Ben Pitts Mercurial 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: bitbucket.org, code.google.com, sourceforge.net

4 Mercurial Structure - Filesystem
Mercurial - Ben Pitts / Working directory Represents one revision Refreshed by 'hg update' /.hgignore List of ignored files Repository folder /.hg/ /.hgignore /.hgtags /.hgtags Tags are global pointers to changesets, like Git /.hg/ Repository store File snapshots Manifest of files Changesets of file deltas Logs of all revisions .hgignore and .hgtags kept 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.

5 Mercurial Structure – Repository
Mercurial - Ben Pitts b1 b2 branch v1 v2 v3 v4 main 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. Like Git, Hg treats history as a directed acyclic graph of revisions, each having pointers to their parents. A revision is a snapshot of the working directory at the time of the commit. The end of each branch is a node pointed to by a head. The repository can contain any number of heads, each a pointer to a changeset with no children. Heads can be merged two at a time into new revisions. The tip is a pointer to the latest head.

6 Mercurial vs. Git Largely equivalent to Git hg-git
Mercurial - Ben Pitts 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

7 Mercurial vs. Git Extensions
Mercurial - Ben Pitts 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]

8 Mercurial vs. Git Staging
Mercurial - Ben Pitts Git Repo git commit Index git add Working Directory Hg Repo hg commit Working Directory 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.

9 Mercurial File Storage
Mercurial - Ben Pitts 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 Compression 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

10 Mercurial File Tracking
Mercurial - Ben Pitts 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.

11 Mercurial History Mercurial - Ben Pitts 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

12 Mercurial vs. Git Rebasing
Mercurial - Ben Pitts 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. Whereas Git is designed to allow the graph to change freely, Mercurial is designed to keep the graph moving forward additively. This means rewriting the commit graph is not allowed in Mercurial. There is a Rebase Extension that allows some rebasing for uncommitted changes. If you 'hg pull' a new head you can attach your changes onto the end of this head with 'hg rebase'. The Rebase function detects conflicts that will disallow the rebase. This operation can also be done as part of a pull with 'hg pull --rebase'. Hg's Rebase will not allow rebasing to your own ancestor, or rebasing to merge revision with external parents.

13 Mercurial Queues (MQ) Mercurial - Ben Pitts To use a Git Index style layer, create a single patch 'hg qnew patchname‘ – 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

14 Mercurial Queues - Patches
Mercurial - Ben Pitts Commit Patch 1 ‘UI Tweak’ Patch 1 ‘Bugfix’ 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

15 Mercurial Queues – Versioning Patches
Mercurial - Ben Pitts 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.

16 Mercurial Branching Mercurial - Ben Pitts 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

17 Mercurial Branching Mercurial supports named branching
Mercurial - Ben Pitts 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.)

18 Mercurial Branching Mercurial Bookmarks Extension Comes in the box
Mercurial - Ben Pitts 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.

19 Mercurial Merge Tools - Internal
Mercurial - Ben Pitts 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

20 Mercurial Merge Tools - External
Mercurial - Ben Pitts Merge tools are selected in /.hg/hgrc [merge-tools] mymergetool.priority = 100 mymergetool.premerge = False mymergetool.args = $local $other $base -o $output myimgmerge = [merge-patterns] **.jpg = myimgmerge **.exe = internal:fail $output expands to the existing file which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up $local expands to file.orig which is created as a copy of file in the working directory version - it thus contains the unmerged version from the first parent $base expands to a temporary file which is created with the version from the merge ancestor $other expands to a temporary file which is created with the version from the new second parent revision which the first parent is merged with .args - the arguments to pass (defaults to $local $base $other) .premerge - whether to attempt internal merge first (defaults to True) .executable - executable name or path (defaults to <tool>) .binary - supports binary files (False) .symlinks - supports symlinks (False) .gui - requires a GUI (False) .priority - priority of this tool (0)

21 Mercurial Merge Tools - External
Mercurial - Ben Pitts 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) $output expands to the existing file which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up $local expands to file.orig which is created as a copy of file in the working directory version - it thus contains the unmerged version from the first parent $base expands to a temporary file which is created with the version from the merge ancestor $other expands to a temporary file which is created with the version from the new second parent revision which the first parent is merged with .args - the arguments to pass (defaults to $local $base $other) .premerge - whether to attempt internal merge first (defaults to True) .executable - executable name or path (defaults to <tool>) .binary - supports binary files (False) .symlinks - supports symlinks (False) .gui - requires a GUI (False) .priority - priority of this tool (0)

22 Mercurial Merge Tools - External
Mercurial - Ben Pitts Interactive merging tools are plentiful KDiff3 Merge GUI Packaged with Hg Meld Linux/Mac/Win meldmerge.org Diffuse Text based interactive merge tool Python diffuse.sourceforge.net $output expands to the existing file which already contains the version from the first parent - and this is also where the result of the merge ends up / must end up $local expands to file.orig which is created as a copy of file in the working directory version - it thus contains the unmerged version from the first parent $base expands to a temporary file which is created with the version from the merge ancestor $other expands to a temporary file which is created with the version from the new second parent revision which the first parent is merged with .args - the arguments to pass (defaults to $local $base $other) .premerge - whether to attempt internal merge first (defaults to True) .executable - executable name or path (defaults to <tool>) .binary - supports binary files (False) .symlinks - supports symlinks (False) .gui - requires a GUI (False) .priority - priority of this tool (0)

23 Mercurial Interfaces SourceTree MacHg TortoiseHg EasyHg
Mercurial - Ben Pitts SourceTree Free Git/Hg GUI for Win/Mac sourcetreeapp.com MacHg Free Hg GUI for Mac jasonfharris.com/machg TortoiseHg Free file browser integration, Windows and Gnome/Nautilus tortoisehg.bitbucket.org EasyHg Simple free Hg GUI for Linux/Mac/Win easyhg.org

24 Mercurial Integration
Mercurial - Ben Pitts Eclipse Mercurial Eclipse plugin bitbucket.org/mercurialeclipse/main NetBeans Supported out of the box Visual Studio HgSccPackage extension Ant ANT4HG Maven Integrated via scm:hg namespace

25 Hg http://mercurial.selenic.com/ Benjamin Pitts
Mercurial - Ben Pitts Hg Benjamin Pitts Computer Science M.S. Student Old Dominion University


Download ppt "Hg History Structure Git Comparison File Storage File Tracking Staging"

Similar presentations


Ads by Google