Mercurial > hg
view tests/test-merge4.t @ 45121:b6269741ed42
config: add option to control creation of empty successors during rewrite
The default for many history-rewriting commands (e.g. rebase and absorb) is
that changesets which would become empty are not created in the target branch.
This makes sense if the source branch consists of small fix-up changes. For
more advanced workflows that make heavy use of history-editing to create
curated patch series, dropping empty changesets is not as important or even
undesirable.
Some users want to keep the meta-history, e.g. to make finding comments in a
code review tool easier or to avoid that divergent bookmarks are created. For
that, obsmarkers from the (to-be) empty changeset to the changeset(s) that
already made the changes should be added. If a to-be empty changeset is pruned
without a successor, adding the obsmarkers is hard because the changeset has to
be found within the hidden part of the history.
If rebasing in TortoiseHg, it’s easy to miss the fact that the to-be empty
changeset was pruned. An empty changeset will function as a reminder that
obsmarkers should be added.
Martin von Zweigbergk mentioned another advantage. Stripping the successor will
de-obsolete the predecessor. If no (empty) successor is created, this won’t be
possible.
In the future, we may want to consider other behaviors, like e.g. creating the
empty successor, but pruning it right away. Therefore this configuration
accepts 'skip' and 'keep' instead of being a boolean configuration.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Sat, 11 Jul 2020 23:53:27 +0200 |
parents | 8561ad49915d |
children | fc4fb2f17dd4 |
line wrap: on
line source
$ hg init $ echo This is file a1 > a $ hg add a $ hg commit -m "commit #0" $ echo This is file b1 > b $ hg add b $ hg commit -m "commit #1" $ hg update 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo This is file c1 > c $ hg add c $ hg commit -m "commit #2" created new head $ hg merge 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ rm b $ echo This is file c22 > c Test hg behaves when committing with a missing file added by a merge $ hg commit -m "commit #3" abort: cannot commit merge with missing files [255] Test conflict*() revsets # Bad usage $ hg log -r 'conflictlocal(foo)' hg: parse error: conflictlocal takes no arguments [255] $ hg log -r 'conflictother(foo)' hg: parse error: conflictother takes no arguments [255] $ hg co -C . 1 files updated, 0 files merged, 0 files removed, 0 files unresolved # No merge parents when not merging $ hg log -r 'conflictlocal() + conflictother()' # No merge parents when there is no conflict $ hg merge 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg log -r 'conflictlocal() + conflictother()' $ hg co -C . 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo conflict > b $ hg ci -Aqm 'conflicting change to b' $ hg merge 1 merging b warning: conflicts while merging b! (edit, then use 'hg resolve --mark') 0 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon [1] # Shows merge parents when there is a conflict $ hg log -r 'conflictlocal()' -T '{rev} {desc}\n' 3 conflicting change to b $ hg log -r 'conflictother()' -T '{rev} {desc}\n' 1 commit #1