Setting up a Mercurial project

$ cd project/
$ hg init           # creates .hg
$ <create .hgignore file>
$ hg status         # show all non-ignored files  
$ hg add            # add those 'unknown' files
$ hg commit         # commit all changes, edit changelog entry

Mercurial will look for a file named [".hgignore"] in the root of your repository which contains a set of regular expressions to ignore in file paths.

Branching and merging

$ hg clone linux linux-work    # create a new branch
$ cd linux-work
$ <make changes>
$ hg commit
$ cd ../linux
$ hg pull ../linux-work     # pull changesets from linux-work
$ hg merge                  # merge the new tip from linux-work into
                            # (old versions used "hg update -m" instead)
                            # our working directory
$ hg commit                 # commit the result of the merge

Importing patches

Fast:

$ patch < ../p/foo.patch
$ hg add            # add files added by the patch
$ hg remove --after # remove files removed by the patch
$ hg commit

Faster:

$ patch < ../p/foo.patch
$ hg commit `lsdiff -p1 ../p/foo.patch`

Fastest:

$ cat ../p/patchlist | xargs hg import -p1 -b ../p

Exporting a patch

(make changes)
$ hg commit
$ hg tip
28237:747a537bd090880c29eae861df4d81b245aa0190
$ hg export 28237 > foo.patch    # export changeset 28237

Network support

# pull from the primary Mercurial repo
foo$ hg clone http://selenic.com/hg/
foo$ cd hg

# export your current repo via HTTP with browsable interface
foo$ hg serve -n "My repo" -p 80

# pushing changes to a remote repo with SSH
foo$ hg push ssh://user@example.com/~/hg/

# merge changes from a remote machine
bar$ hg pull http://foo/
bar$ hg merge # merge changes into your working directory

# Set up a CGI server on your webserver
foo$ cp hgwebdir.cgi ~/public_html/hg/index.cgi 
foo$ emacs ~/public_html/hg/index.cgi # adjust the defaults