git/builtin
Johannes Schindelin 7543f6f444 rebase -i: introduce --rebase-merges=[no-]rebase-cousins
When running `git rebase --rebase-merges` non-interactively with an
ancestor of HEAD as <upstream> (or leaving the todo list unmodified),
we would ideally recreate the exact same commits as before the rebase.

However, if there are commits in the commit range <upstream>.. that do not
have <upstream> as direct ancestor (i.e. if `git log <upstream>..` would
show commits that are omitted by `git log --ancestry-path <upstream>..`),
this is currently not the case: we would turn them into commits that have
<upstream> as direct ancestor.

Let's illustrate that with a diagram:

        C
      /   \
A - B - E - F
  \   /
    D

Currently, after running `git rebase -i --rebase-merges B`, the new branch
structure would be (pay particular attention to the commit `D`):

       --- C' --
      /         \
A - B ------ E' - F'
      \    /
        D'

This is not really preserving the branch topology from before! The
reason is that the commit `D` does not have `B` as ancestor, and
therefore it gets rebased onto `B`.

This is unintuitive behavior. Even worse, when recreating branch
structure, most use cases would appear to want cousins *not* to be
rebased onto the new base commit. For example, Git for Windows (the
heaviest user of the Git garden shears, which served as the blueprint
for --rebase-merges) frequently merges branches from `next` early, and
these branches certainly do *not* want to be rebased. In the example
above, the desired outcome would look like this:

       --- C' --
      /         \
A - B ------ E' - F'
  \        /
   -- D' --

Let's introduce the term "cousins" for such commits ("D" in the
example), and let's not rebase them by default. For hypothetical
use cases where cousins *do* need to be rebased, `git rebase
--rebase=merges=rebase-cousins` needs to be used.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-26 12:28:43 +09:00
..
add.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
am.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
annotate.c
apply.c
archive.c
bisect--helper.c
blame.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
branch.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
bundle.c
cat-file.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
check-attr.c
check-ignore.c
check-mailmap.c
check-ref-format.c
checkout-index.c
checkout.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
clean.c
clone.c object-store: close all packs upon clearing the object store 2018-03-26 10:05:55 -07:00
column.c
commit-tree.c sha1_file: convert assert_sha1_type to object_id 2018-03-14 09:23:49 -07:00
commit.c Merge branch 'bw/commit-partial-from-subdirectory-fix' 2018-04-25 13:28:53 +09:00
config.c config: change default of `pager.config` to "on" 2018-02-21 14:27:30 -08:00
count-objects.c packfile: keep prepare_packed_git() private 2018-03-26 10:07:43 -07:00
credential.c
describe.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
diff-files.c
diff-index.c
diff-tree.c object: rename function 'typename' to 'type_name' 2018-02-14 13:10:05 -08:00
diff.c
difftool.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
fast-export.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
fetch-pack.c
fetch.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
fmt-merge-msg.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
for-each-ref.c
fsck.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
gc.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
get-tar-commit-id.c
grep.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
hash-object.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
help.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
index-pack.c sha1_file.c: rename to use dash in file name 2018-04-11 18:11:00 +09:00
init-db.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
interpret-trailers.c
log.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
ls-files.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
ls-remote.c
ls-tree.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
mailinfo.c
mailsplit.c
merge-base.c
merge-file.c
merge-index.c
merge-ours.c
merge-recursive.c
merge-tree.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
merge.c Merge branch 'sb/object-store' 2018-04-11 13:09:55 +09:00
mktag.c Convert lookup_replace_object to struct object_id 2018-03-14 09:23:50 -07:00
mktree.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
mv.c Merge branch 'sm/mv-dry-run-update' into maint 2018-03-22 14:24:25 -07:00
name-rev.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
notes.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
pack-objects.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
pack-redundant.c Merge branch 'sb/packfiles-in-repository' 2018-04-11 13:09:55 +09:00
pack-refs.c
patch-id.c
prune-packed.c
prune.c sha1_file: convert sha1_object_info* to object_id 2018-03-14 09:23:49 -07:00
pull.c pull: accept --rebase=merges to recreate the branch topology 2018-04-26 12:28:43 +09:00
push.c
read-tree.c
rebase--helper.c rebase -i: introduce --rebase-merges=[no-]rebase-cousins 2018-04-26 12:28:43 +09:00
receive-pack.c exec_cmd: rename to use dash in file name 2018-04-11 18:11:00 +09:00
reflog.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
remote-ext.c
remote-fd.c
remote.c pull: accept --rebase=merges to recreate the branch topology 2018-04-26 12:28:43 +09:00
repack.c
replace.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
rerere.c
reset.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
rev-list.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
rev-parse.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
revert.c
rm.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
send-pack.c
shortlog.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
show-branch.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
show-ref.c Convert find_unique_abbrev* to struct object_id 2018-03-14 09:23:48 -07:00
stripspace.c
submodule--helper.c Merge branch 'rs/status-with-removed-submodule' 2018-04-11 13:09:56 +09:00
symbolic-ref.c
tag.c Merge branch 'jk/ref-array-push' 2018-04-25 13:28:59 +09:00
unpack-file.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
unpack-objects.c Merge branch 'bc/object-id' 2018-04-10 08:25:45 +09:00
update-index.c Merge branch 'ps/contains-id-error-message' 2018-04-10 16:28:20 +09:00
update-ref.c
update-server-info.c
upload-archive.c
var.c
verify-commit.c sha1_file: convert read_sha1_file to struct object_id 2018-03-14 09:23:50 -07:00
verify-pack.c
verify-tag.c ref-filter: use "struct object_id" consistently 2018-04-09 06:14:45 +09:00
worktree.c Merge branch 'nd/worktree-prune' 2018-04-10 08:25:45 +09:00
write-tree.c cache-tree: convert write_*_as_tree to object_id 2018-03-14 09:23:47 -07:00