Compare two nodes
Any two arbitrary nodes in the Project View tool window can be visually compared:
The standard VCS comparison dialog shows up that visualizes the mutual differences and allows easy modifications.
The VCS menu contains commands and configurations related to version control:
In order to configure VCS for your project, open the Preferences (Control + Alt + S or Cmd + ,) and choose the Version Control item:
Among other things you must configure the project roots for the individual version control systems used.
The Changes View tool window at the bottom (Alt + 9 or Cmd + 9) lists all files/models that have been modified. The view can be configured using the buttons on the side of the window. A context pop-up menu provides quick access to frequently used VCS-related actions applicable to the selected items:
The Log tab of the Changes View visualizes the commit history:
When you first open MPS with version control or add VCS mapping for existing project, it offers you installing some global settings and install so called VCS Add-ons (they can also be installed from main menu: Version Control Install MPS VCS Add-ons).
What are VCS Add-ons
VCS Add-ons are special hooks, or merge drivers for Subversion and Git, which override merging mechanism for special types of files. In case of MPS, these addons determine merging for model files (*.mps) and generated model caches (dependencies, generatedand trace.info files, if you store them under version control). Every time you invoke some version control procedure (like merging branches or Git rebasing) which involves merging file modifications, these hooks are invoked. For models, it reads their XML content and tries to merge changes in high level, "model" terms (instead of merging lines of XML file which may lead to invalid XML markup). Sometimes models cannot be merged automatically. In that case, it stays in "conflicting" state, and it can be merged in UI of MPS.
In some cases during work of merge driver, there may happen id conflicts, situations when model has more than one node with the same id after applying all non-conflicting changes. In this situation, no automatic merging is performed, because it may lead to problems with references to nodes which are hard to find. In this case you should should look through merge result by himself and decide if it okay.
For model caches merge driver works in a different way (if you store them under version control, of course). Generator dependencies (generated files) and debugger trace caches (trace.info files) are just cleared after merging, so you will need to regenerate corresponding models. Java dependencies (dependencies files) which are used on compilation are merged using simple union algorithm which makes compilation possible after merging.
Different VCS Add-ons
Look at the dialog:
There are several types of VCS Add-ons which can be installed. It is recommended to install them all.
Git global autocrlf setting. Forces git to store text files in repository with standart Unix line endings (LF), while text files in working copy use local system-dependent line endings. Necessary when developers of your project use different operating systems with different line-endings (Windows and Unix).
Git global merge driver setting. Registers merge driver for MPS models in global Git settings so they can be referred in .gitattributes files of Git repositories (see below). It only maps merge driver name (in this case, "mps") with path to actual merge driver command.
Git file attributes for repositories. Enables MPS merge driver for concrete file types (*.mps, trace.info, etc) s in Git repositories used in opened MPS project. This creates or modifies file in root of Git repository. This file usually should be stored under version control so these settings will be shared among developers of the project.
Subversion custom diff3 cmd. Registers MPS merger in config file of Subversion. MPS may use its own config folder for Subversion, so there are two different checkboxes. One updates global config used when you invoke Subversion procedures from command line or tools like TortoiseSVN. Another one modifies config only for MPS Subversion plugin. By the way, directory for Subversion config used in MPS can be defined in Subversion settings.
Conflict resolution in the merge dialog
Merge conflicts can be resolved manually by the user. A three-window merge dialog shows the user both conflicting versions and the result of manual conflict resolution in the middle. Code can be moved from both side windows or edited manually.
For children in a multiple cardinality role it is convenient to be able to add children from both side windows. So after applying changes from one side of the conflict the other conflicting changes are converted to an "addition" that can be applied to the end of the changed group.
For example:After applying the left version of the conflict you can still apply or ignore the line from the right side: