Resolve Git conflicts
When you work in a team, you may come across a situation when somebody pushes changes to a file you are currently working on. If these changes do not overlap (that is, changes were made to different lines of code), the conflicting files are merged automatically. However, if the same lines were affected, Git cannot randomly pick one side over the other, and asks you to resolve the conflict.
In Git, conflicts may arise when you attempt to perform one of the following operations: pull, merge, rebase, cherry-pick, unstash changes or apply a patch. If there are conflicts, these operations will fail, and you will be prompted to accept the upstream version, prefer your version, or merge the changes:
MPS provides a tool for resolving conflicts locally. This tool consists of three panes. The left pane shows the read-only local copy; the right pane shows the read-only version checked in to the repository. The central pane shows a fully-functional editor where the results of merging and resolving conflicts are displayed. Initially, the contents of this pane are the same as the base revision of the file, that is, the revision from which both conflicting versions are derived.
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:
Resolve conflicts
Click Merge in the Conflicts dialog, or select the conflicting file in the editor and choose VCS | <your_VCS> | Resolve Conflicts from the main menu.
To automatically merge all non-conflicting changes, click (Apply All Non-Conflicting Changes) on the toolbar. You can also use the (Apply Non-Conflicting Changes from the Left Side) and (Apply Non-Conflicting Changes from the Right Side) to merge non-conflicting changes from the left/right parts of the dialog respectively.
-
To resolve a conflict, you need to select which action to apply (accept or ignore ) to the left (local) and the right (repository) version, and check the resulting code in the central pane:
You can also right-click a conflict in the central pane and use the commands from the context. The Resolve using Left and Resolve using Right commands provide a shortcut to accepting changes from one side and ignoring them from the other side respectively:
For simple conflicts (for example, if the beginning and the end of the same line have been modified in different file revisions), the Resolve simple conflicts option is available that allows merging the changes in one click.
Such conflicts are not resolved with the Apply All Non-Conflicting Changes action since you must make sure that they are resolved properly.
-
It may also be useful to compare different versions to resolve a conflict. Use the toolbar button to invoke the list of options. Note that Base refers to the file version that the local and the repository versions originated from (initially displayed in the middle pane), while Middle refers to the resulting version.
Review merge results in the central pane and click Apply.
Productivity tips
- Apply non-conflicting changes automatically
-
You can configure MPS to always apply non-conflicting changes automatically instead of telling it to do so from the Merge dialog. To do this, in the Settings/Preferences dialog Ctrl+Alt+S, go to Tools | Diff Merge on the left and select the Automatically apply non-conflicting changes option.
- Manage changes in the central pane
-
You can manage changes in the central pane using the toolbar that appears when you hover the mouse cursor over a change marker in the gutter, and then click it. The toolbar is displayed together with a frame showing the previous contents of the modified line:
For example, when there are multiple non-conflicting changes, and you only need to skip one or two of them, it's easier to apply all of them simultaneously using the Apply all non-conflicting changes action, and then undo the unwanted ones using the Revert action from this toolbar.
Handle conflicts related to LF and CRLF line endings
Quite often, people working in a team and contributing to the same repository use different operating systems. This may result in problems with line ending, because Unix, Linux and MacOS us LF
, and Windows uses CRLF
to mark the end of a line.
MPS displays the discrepancies in line endings in the Differences Viewer, so you can fix them manually. If you want Git to solve such conflicts automatically, you need to set the core.autocrlf
attribute to true
on Windows and to input
on Linux and MacOS (for more details, see Dealing with line endings). You can change the configuration manually by running git config --global core.autocrlf true
on Windows or git config --global core.autocrlf input
on Linux and macOS.
However, MPS can automatically analyze your configuration, warn you if you are about to commit CRLF
into a remote repository, and suggest setting the core.autocrlf
setting to true
or input
depending on your operating system.
To enable smart handling of LF
and CRLF
line separators, open the Settings Preferences dialog Ctrl+Alt+S, and select the Version Control | Git node on the left. Enable the Warn if CRLF line separators are about to be committed option.
After you have enabled this option, MPS will display the Line Separators Warning Dialog each time you are about to commit a file with CRLF
separators, unless you have set any related Git attributes in the affected file (in this case, MPS supposes that you clearly understand what you are doing and excludes this file from analysis).
In the Line Separators Warning Dialog, click one of the following:
Commit As Is to ignore the warning and commit a file with
CRFL
separators.Fix and Commit to have the
core.autocrlf
attribute set totrue
orinput
depending on your operating system. As a result,CRLF
line separators will be replaced withLF
before the commit.
If, at a later time, you need to review how exactly conflicts were resolved during a merge, you can locate the required merge commit in the Log tab of the Version Control tool window Alt+9, select a file with conflicts in the Commit Details pane in the right, and click or press Ctrl+D (see Review how changes were merged for details).