Mercurial > hg
view relnotes/5.4 @ 52081:a021da4ec509
merge: add a config to allow conflict-free merge of changes on adjacent lines
This change adds a config to make it no longer a conflict to merge changes
made on adjacent lines.
The reason these changes are considered a conflict is that there's no
region of text at the relevant position (sync region) that's kept unchanged
by both sides of the merge.
The problem can be solved by making the sync regions being a bit more
powerful: we can keep a 0-length sync region if we find that
a block unchanged by one side is ajacent to a block unchanged by the
other side.
Since these 0-length sync regions are emitted using the ~same algorithm
as the normal non-empty sync regions, this change involves no arbitrary
decisions and I expect it to work pretty well.
0-length sync regions do create an ambiguity in a special case where two
pairs of adjacent regions "meet" at the same point. This corresponds to
an insertion made at the same place by the two sides of the merge, and
this still results in a conflict.
author | Arseniy Alekseyev <aalekseyev@janestreet.com |
---|---|
date | Thu, 24 Oct 2024 17:35:53 +0200 |
parents | f445a4f7e8a7 |
children |
line wrap: on
line source
== New Features == * `hg purge`/`hg clean` can now delete ignored files instead of untracked files, with the new -i flag. * `hg pull` now has a `--confirm` flag to prompt before applying changes. Config option `pull.confirm` is also added for that. * `hg log` now defaults to using an '%' symbol for commits involved in unresolved merge conflicts. That includes unresolved conflicts caused by e.g. `hg update --merge` and `hg graft`. '@' still takes precedence, so what used to be marked '@' still is. * New `conflictlocal()` and `conflictother()` revsets return the commits that are being merged, when there are conflicts. Also works for conflicts caused by e.g. `hg graft`. * `hg copy --forget` can be used to unmark a file as copied. * The `format.revlog-compression` configuration entry now accept a list. The first available option will be used. for example setting:: [format] revlog-compression=zstd, zlib Will use `zstd` compression for new repositories is available, and will simply fall back to `zlib` if not. * `hg debugmergestate` output is now templated, which may be useful e.g. for IDEs that want to help the user resolve merge conflicts. == New Experimental Features == * `hg copy` now supports a `--at-rev` argument to mark files as copied in the specified commit. It only works with `--after` for now (i.e., it's only useful for marking files copied using non-hg `cp` as copied). * Use `hg copy --forget --at-rev REV` to unmark already committed copies. == Bug Fixes == * Fix server exception when concurrent pushes delete the same bookmark * Prevent pushes of divergent bookmarks (foo@remote) * The push error "remote repository changed while pushing - please try again" now only happens when a concurrent push changed related heads (instead of when a concurrent pushed any revision). == Backwards Compatibility Changes == * When `hg rebase` pauses for merge conflict resolution, the working copy will no longer have the rebased node as a second parent. You can use the new `conflictparents()` revset for finding the other parent during a conflict. * `hg rebase` now accepts repeated `--source` and `--base` arguments. For example, `hg rebase --source 'A + B'` is equivalent to `hg rebase --source A --source B`. This is a backwards-incompatible change because it will break overriding an alias `myrebase = rebase --source A` by `hg myrebase --source B` (it will now rebase `(A + B)::` instead of `B::`). * `hg recover` does not verify the validity of the whole repository anymore. You can pass `--verify` or call `hg verify` if necessary. * `hg debugmergestate` output format changed. Let us know if that is causing you problems and we'll roll it back. * Resolved merge conflicts are now cleared by `hg commit` even if the working copy has no changes. == Internal API Changes == * The deprecated `ui.progress()` has now been deleted. Please use `ui.makeprogress()` instead. * `hg.merge()` now takes a `ctx` instead of the previous `repo` and `node` arguments. * `hg.merge()` has lost its `abort` argument. Please call `hg.abortmerge()` directly instead. * `hg.merge()` has lost its `mergeforce` argument. It should have only ever been called with the same value as the `force` argument. * The `*others` argument of `cmdutil.check_incompatible_arguments()` changed from being varargs argument to being a single collection.