From: Ruslan Yakauleu <ruslan.yakauleu@xxxxxxxxx> A new option --ff-one-only to control the merging strategy. For one commit option works like -ff to avoid extra merge commit. In other cases the option works like --no-ff to create merge commit for complex features. Signed-off-by: Ruslan Yakauleu <ruslan.yakauleu@xxxxxxxxx> --- merge: --ff-one-only to apply FF if commit is one A new option --ff-one-only to control the merging strategy. For one commit option works like -ff to avoid extra merge commit. In other cases the option works like --no-ff to create merge commit for complex features. Plenty of developers want to simplify merge history. We have two main merging strategies: * Fast-forward (--ff) - There we can lose merge commits for complex features and if we need to roll back some feature we can't revert just one commit. * Merge (--no-ff) - There we have extra merges for extra simple changes. Before, the user had to choose between --ff/--no-ff every time to have history without extra merges for simple changes and to use merges for complex features. Ways to use the new option: git merge --ff-one-only git config merge.ff one-only git config branch.master.mergeoptions --ff-one-only Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1599%2FQuAzI%2Fmerge%2Fff-one-only-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1599/QuAzI/merge/ff-one-only-v1 Pull-Request: https://github.com/git/git/pull/1599 Documentation/config/merge.txt | 3 +++ builtin/merge.c | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Documentation/config/merge.txt b/Documentation/config/merge.txt index 8851b6cedef..6cd5daa4d64 100644 --- a/Documentation/config/merge.txt +++ b/Documentation/config/merge.txt @@ -31,6 +31,9 @@ merge.ff:: a case (equivalent to giving the `--no-ff` option from the command line). When set to `only`, only such fast-forward merges are allowed (equivalent to giving the `--ff-only` option from the + command line). When set to `one-only`, fast-forward merge allowed + only for one commit, in other way extra merge commit should be + created (equivalent to giving the `--ff-one-only` option from the command line). merge.verifySignatures:: diff --git a/builtin/merge.c b/builtin/merge.c index d748d46e135..100f0021e56 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -110,7 +110,8 @@ static const char *pull_twohead, *pull_octopus; enum ff_type { FF_NO, FF_ALLOW, - FF_ONLY + FF_ONLY, + FF_ONE_ONLY }; static enum ff_type fast_forward = FF_ALLOW; @@ -258,6 +259,7 @@ static struct option builtin_merge_options[] = { N_("edit message before committing")), OPT_CLEANUP(&cleanup_arg), OPT_SET_INT(0, "ff", &fast_forward, N_("allow fast-forward (default)"), FF_ALLOW), + OPT_SET_INT(0, "ff-one-only", &fast_forward, N_("allow fast-forward if only one commit"), FF_ONE_ONLY), OPT_SET_INT_F(0, "ff-only", &fast_forward, N_("abort if fast-forward is not possible"), FF_ONLY, PARSE_OPT_NONEG), @@ -631,6 +633,8 @@ static int git_merge_config(const char *k, const char *v, fast_forward = boolval ? FF_ALLOW : FF_NO; } else if (v && !strcmp(v, "only")) { fast_forward = FF_ONLY; + } else if (v && !strcmp(v, "one-only")) { + fast_forward = FF_ONE_ONLY; } /* do not barf on values from future versions of git */ return 0; } else if (!strcmp(k, "merge.defaulttoupstream")) { @@ -1527,6 +1531,18 @@ int cmd_merge(int argc, const char **argv, const char *prefix) free(list); } + if (fast_forward == FF_ONE_ONLY) { + fast_forward = FF_NO; + + /* check that we have one and only one commit to merge */ + if (squash || ((!remoteheads->next && + !common->next && + oideq(&common->item->object.oid, &head_commit->object.oid)) && + oideq(&remoteheads->item->parents->item->object.oid, &head_commit->object.oid))) { + fast_forward = FF_ALLOW; + } + } + update_ref("updating ORIG_HEAD", "ORIG_HEAD", &head_commit->object.oid, NULL, 0, UPDATE_REFS_DIE_ON_ERR); base-commit: 2e8e77cbac8ac17f94eee2087187fa1718e38b14 -- gitgitgadget