Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: git/git
base: aca13c2355e7188432cb32aedf0bb0c477ec011a
Choose a base ref
...
head repository: git/git
compare: f5a3c5e6377b806c320e4220ba26e467b4c4e992
Choose a head ref
  • 2 commits
  • 8 files changed
  • 1 contributor

Commits on Aug 5, 2021

  1. Change default merge backend from recursive to ort

    There are a few reasons to switch the default:
      * Correctness
      * Extensibility
      * Performance
    
    I'll provide some summaries about each.
    
    === Correctness ===
    
    The original impetus for a new merge backend was to fix issues that were
    difficult to fix within recursive's design.  The success with this goal
    is perhaps most easily demonstrated by running the following:
    
      $ git grep -2 KNOWN_FAILURE t/ | grep -A 4 GIT_TEST_MERGE_ALGORITHM
      $ git grep test_expect_merge_algorithm.failure.success t/
      $ git grep test_expect_merge_algorithm.success.failure t/
    
    In order, these greps show:
    
      * Seven sets of submodule tests (10 total tests) that fail with
        recursive but succeed with ort
      * 22 other tests that fail with recursive, but succeed with ort
      * 0 tests that pass with recursive, but fail with ort
    
    === Extensibility ===
    
    Being able to perform merges without touching the working tree or index
    makes it possible to create new features that were difficult with the
    old backend:
    
      * Merging, cherry-picking, rebasing, reverting in bare repositories...
        or just on branches that aren't checked out.
    
      * `git diff AUTO_MERGE` -- ability to see what changes the user has
        made to resolve conflicts so far (see commit 5291828 ("merge-ort:
        write $GIT_DIR/AUTO_MERGE whenever we hit a conflict", 2021-03-20)
    
      * A --remerge-diff option for log/show, used to show diffs for merges
        that display the difference between what an automatic merge would
        have created and what was recorded in the merge.  (This option will
        often result in an empty diff because many merges are clean, but for
        the non-clean ones it will show how conflicts were fixed including
        the removal of conflict markers, and also show additional changes
        made outside of conflict regions to e.g. fix semantic conflicts.)
    
      * A --remerge-diff-only option for log/show, similar to --remerge-diff
        but also showing how cherry-picks or reverts differed from what an
        automatic cherry-pick or revert would provide.
    
    The last three have been implemented already (though only one has been
    submitted upstream so far; the others were waiting for performance work
    to complete), and I still plan to implement the first one.
    
    === Performance ===
    
    I'll quote from the summary of my final optimization for merge-ort
    (while fixing the testcase name from 'no-renames' to 'few-renames'):
    
                                   Timings
    
                                              Infinite
                     merge-       merge-     Parallelism
                    recursive    recursive    of rename    merge-ort
                     v2.30.0      current     detection     current
                    ----------   ---------   -----------   ---------
    few-renames:      18.912 s    18.030 s     11.699 s     198.3 ms
    mega-renames:   5964.031 s   361.281 s    203.886 s     661.8 ms
    just-one-mega:   149.583 s    11.009 s      7.553 s     264.6 ms
    
                               Speedup factors
    
                                              Infinite
                     merge-       merge-     Parallelism
                    recursive    recursive    of rename
                     v2.30.0      current     detection    merge-ort
                    ----------   ---------   -----------   ---------
    few-renames:        1           1.05         1.6           95
    mega-renames:       1          16.5         29           9012
    just-one-mega:      1          13.6         20            565
    
    And, for partial clone users:
    
                 Factor reduction in number of objects needed
    
                                              Infinite
                     merge-       merge-     Parallelism
                    recursive    recursive    of rename
                     v2.30.0      current     detection    merge-ort
                    ----------   ---------   -----------   ---------
    mega-renames:       1            1            1          181.3
    
    Signed-off-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    newren authored and gitster committed Aug 5, 2021
    Copy the full SHA
    6a5fb96 View commit details
    Browse the repository at this point in the history
  2. Update docs for change of default merge backend

    Make it clear that `ort` is the default merge strategy now rather than
    `recursive`, including moving `ort` to the front of the list of merge
    strategies.
    
    Signed-off-by: Elijah Newren <newren@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
    newren authored and gitster committed Aug 5, 2021
    Copy the full SHA
    f5a3c5e View commit details
    Browse the repository at this point in the history