| MERGE STRATEGIES |
| ---------------- |
| |
| The merge mechanism (`git merge` and `git pull` commands) allows the |
| backend 'merge strategies' to be chosen with `-s` option. Some strategies |
| can also take their own options, which can be passed by giving `-X<option>` |
| arguments to `git merge` and/or `git pull`. |
| |
| ort:: |
| This is the default merge strategy when pulling or merging one |
| branch. This strategy can only resolve two heads using a |
| 3-way merge algorithm. When there is more than one common |
| ancestor that can be used for 3-way merge, it creates a merged |
| tree of the common ancestors and uses that as the reference |
| tree for the 3-way merge. This has been reported to result in |
| fewer merge conflicts without causing mismerges by tests done |
| on actual merge commits taken from Linux 2.6 kernel |
| development history. Additionally this strategy can detect |
| and handle merges involving renames. It does not make use of |
| detected copies. The name for this algorithm is an acronym |
| ("Ostensibly Recursive's Twin") and came from the fact that it |
| was written as a replacement for the previous default |
| algorithm, `recursive`. |
| + |
| The 'ort' strategy can take the following options: |
| |
| ours;; |
| This option forces conflicting hunks to be auto-resolved cleanly by |
| favoring 'our' version. Changes from the other tree that do not |
| conflict with our side are reflected in the merge result. |
| For a binary file, the entire contents are taken from our side. |
| + |
| This should not be confused with the 'ours' merge strategy, which does not |
| even look at what the other tree contains at all. It discards everything |
| the other tree did, declaring 'our' history contains all that happened in it. |
| |
| theirs;; |
| This is the opposite of 'ours'; note that, unlike 'ours', there is |
| no 'theirs' merge strategy to confuse this merge option with. |
| |
| ignore-space-change;; |
| ignore-all-space;; |
| ignore-space-at-eol;; |
| ignore-cr-at-eol;; |
| Treats lines with the indicated type of whitespace change as |
| unchanged for the sake of a three-way merge. Whitespace |
| changes mixed with other changes to a line are not ignored. |
| See also linkgit:git-diff[1] `-b`, `-w`, |
| `--ignore-space-at-eol`, and `--ignore-cr-at-eol`. |
| + |
| * If 'their' version only introduces whitespace changes to a line, |
| 'our' version is used; |
| * If 'our' version introduces whitespace changes but 'their' |
| version includes a substantial change, 'their' version is used; |
| * Otherwise, the merge proceeds in the usual way. |
| |
| renormalize;; |
| This runs a virtual check-out and check-in of all three stages |
| of a file when resolving a three-way merge. This option is |
| meant to be used when merging branches with different clean |
| filters or end-of-line normalization rules. See "Merging |
| branches with differing checkin/checkout attributes" in |
| linkgit:gitattributes[5] for details. |
| |
| no-renormalize;; |
| Disables the `renormalize` option. This overrides the |
| `merge.renormalize` configuration variable. |
| |
| find-renames[=<n>];; |
| Turn on rename detection, optionally setting the similarity |
| threshold. This is the default. This overrides the |
| 'merge.renames' configuration variable. |
| See also linkgit:git-diff[1] `--find-renames`. |
| |
| rename-threshold=<n>;; |
| Deprecated synonym for `find-renames=<n>`. |
| |
| subtree[=<path>];; |
| This option is a more advanced form of 'subtree' strategy, where |
| the strategy makes a guess on how two trees must be shifted to |
| match with each other when merging. Instead, the specified path |
| is prefixed (or stripped from the beginning) to make the shape of |
| two trees to match. |
| |
| recursive:: |
| This can only resolve two heads using a 3-way merge |
| algorithm. When there is more than one common |
| ancestor that can be used for 3-way merge, it creates a |
| merged tree of the common ancestors and uses that as |
| the reference tree for the 3-way merge. This has been |
| reported to result in fewer merge conflicts without |
| causing mismerges by tests done on actual merge commits |
| taken from Linux 2.6 kernel development history. |
| Additionally this can detect and handle merges involving |
| renames. It does not make use of detected copies. This was |
| the default strategy for resolving two heads from Git v0.99.9k |
| until v2.33.0. |
| + |
| The 'recursive' strategy takes the same options as 'ort'. However, |
| there are three additional options that 'ort' ignores (not documented |
| above) that are potentially useful with the 'recursive' strategy: |
| |
| patience;; |
| Deprecated synonym for `diff-algorithm=patience`. |
| |
| diff-algorithm=[patience|minimal|histogram|myers];; |
| Use a different diff algorithm while merging, which can help |
| avoid mismerges that occur due to unimportant matching lines |
| (such as braces from distinct functions). See also |
| linkgit:git-diff[1] `--diff-algorithm`. Note that `ort` |
| specifically uses `diff-algorithm=histogram`, while `recursive` |
| defaults to the `diff.algorithm` config setting. |
| |
| no-renames;; |
| Turn off rename detection. This overrides the `merge.renames` |
| configuration variable. |
| See also linkgit:git-diff[1] `--no-renames`. |
| |
| resolve:: |
| This can only resolve two heads (i.e. the current branch |
| and another branch you pulled from) using a 3-way merge |
| algorithm. It tries to carefully detect criss-cross |
| merge ambiguities. It does not handle renames. |
| |
| octopus:: |
| This resolves cases with more than two heads, but refuses to do |
| a complex merge that needs manual resolution. It is |
| primarily meant to be used for bundling topic branch |
| heads together. This is the default merge strategy when |
| pulling or merging more than one branch. |
| |
| ours:: |
| This resolves any number of heads, but the resulting tree of the |
| merge is always that of the current branch head, effectively |
| ignoring all changes from all other branches. It is meant to |
| be used to supersede old development history of side |
| branches. Note that this is different from the -Xours option to |
| the 'recursive' merge strategy. |
| |
| subtree:: |
| This is a modified `ort` strategy. When merging trees A and |
| B, if B corresponds to a subtree of A, B is first adjusted to |
| match the tree structure of A, instead of reading the trees at |
| the same level. This adjustment is also done to the common |
| ancestor tree. |
| |
| With the strategies that use 3-way merge (including the default, 'ort'), |
| if a change is made on both branches, but later reverted on one of the |
| branches, that change will be present in the merged result; some people find |
| this behavior confusing. It occurs because only the heads and the merge base |
| are considered when performing a merge, not the individual commits. The merge |
| algorithm therefore considers the reverted change as no change at all, and |
| substitutes the changed version instead. |