You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
6.5 KiB
153 lines
6.5 KiB
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.
|
|
|