The active mergestate is stored in ``.hg/merge`` when a merge is triggered by commands like ``hg merge``, ``hg rebase``, etc. until the merge is completed or aborted to track the 3-way merge state of individual files. The contents of the directory are: Conflicting files ----------------- The local version of the conflicting files are stored with their filenames as the hash of their paths. state ----- This mergestate file record is used by hg version prior to 2.9.1 and contains less data than ``state2``. If there is no contradiction with ``state2``, we can assume that both are written at the same time. In this case, data from ``state2`` is used. Otherwise, we use ``state``. We read/write both ``state`` and ``state2`` records to ensure backward compatibility. state2 ------ This record stores a superset of data in ``state``, including new kinds of records in the future. Each record can contain arbitrary content and has an associated type. This `type` should be a letter. If `type` is uppercase, the record is mandatory: versions of Mercurial that don't support it should abort. If `type` is lowercase, the record can be safely ignored. Currently known records: | * L: the node of the "local" part of the merge (hexified version) | * O: the node of the "other" part of the merge (hexified version) | * F: a file to be merged entry | * C: a change/delete or delete/change conflict | * P: a path conflict (file vs directory) | * f: a (filename, dictionary) tuple of optional values for a given file | * X: unsupported mandatory record type (used in tests) | * x: unsupported advisory record type (used in tests) | * l: the labels for the parts of the merge. Merge record states (indexed by filename): | * u: unresolved conflict | * r: resolved conflict | * pu: unresolved path conflict (file conflicts with directory) | * pr: resolved path conflict The resolve command transitions between 'u' and 'r' for conflicts and 'pu' and 'pr' for path conflicts. This format is a list of arbitrary records of the form: [type][length][content] `type` is a single character, `length` is a 4 byte integer, and `content` is an arbitrary byte sequence of length `length`. Mercurial versions prior to 3.7 have a bug where if there are unsupported mandatory merge records, attempting to clear out the merge state with hg update --clean or similar aborts. The 't' record type works around that by writing out what those versions treat as an advisory record, but later versions interpret as special: the first character is the 'real' record type and everything onwards is the data.