merge: introduce merge.ff configuration variable
This variable gives the default setting for --ff, --no-ff or --ff-only options of "git merge" command. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Junio C Hamano committed
May 6, 2011 at 12:27 UTC
f23e8decd544c8f81b40c98211f6cb028fa70cdc
3 files changed
+60
-2
Documentation/merge-config.txt
+10
@@ -16,6 +16,16 @@ merge.defaultToUpstream::
16
to their corresponding remote tracking branches, and the tips of
17
these tracking branches are merged.
18
19
+merge.ff::
20
+ By default, git does not create an extra merge commit when merging
21
+ a commit that is a descendant of the current commit. Instead, the
22
+ tip of the current branch is fast-forwarded. When set to `false`,
23
+ this variable tells git to create an extra merge commit in such
24
+ a case (equivalent to giving the `--no-ff` option from the command
25
+ line). When set to `only`, only such fast-forward merges are
26
+ allowed (equivalent to giving the `--ff-only` option from the
27
+ command line).
28
+
29
merge.log::
30
In addition to branch names, populate the log message with at
31
most the specified number of one-line descriptions from the
builtin/merge.c
+9
@@ -550,6 +550,15 @@ static int git_merge_config(const char *k, const char *v, void *cb)
550
if (is_bool && shortlog_len)
551
shortlog_len = DEFAULT_MERGE_LOG_LEN;
552
return 0;
553
+ } else if (!strcmp(k, "merge.ff")) {
554
+ int boolval = git_config_maybe_bool(k, v);
555
+ if (0 <= boolval) {
556
+ allow_fast_forward = boolval;
557
+ } else if (v && !strcmp(v, "only")) {
558
+ allow_fast_forward = 1;
559
+ fast_forward_only = 1;
560
+ } /* do not barf on values from future versions of git */
561
+ return 0;
562
} else if (!strcmp(k, "merge.defaulttoupstream")) {
563
default_to_upstream = git_config_bool(k, v);
564
return 0;
t/t7600-merge.sh
+41
-2
@@ -225,12 +225,28 @@ test_expect_success 'merge c1 with c2 and c3' '
225
226
test_debug 'git log --graph --decorate --oneline --all'
227
228
-test_expect_success 'failing merges with --ff-only' '
228
+test_expect_success 'merges with --ff-only' '
229
git reset --hard c1 &&
230
test_tick &&
231
test_must_fail git merge --ff-only c2 &&
232
test_must_fail git merge --ff-only c3 &&
233
- test_must_fail git merge --ff-only c2 c3
233
+ test_must_fail git merge --ff-only c2 c3 &&
234
+ git reset --hard c0 &&
235
+ git merge c3 &&
236
+ verify_head $c3
237
+'
238
+
239
+test_expect_success 'merges with merge.ff=only' '
240
+ git reset --hard c1 &&
241
+ test_tick &&
242
+ test_when_finished "git config --unset merge.ff" &&
243
+ git config merge.ff only &&
244
+ test_must_fail git merge c2 &&
245
+ test_must_fail git merge c3 &&
246
+ test_must_fail git merge c2 c3 &&
247
+ git reset --hard c0 &&
248
+ git merge c3 &&
249
+ verify_head $c3
250
'
251
252
test_expect_success 'merge c0 with c1 (no-commit)' '
@@ -448,6 +464,29 @@ test_expect_success 'merge c0 with c1 (no-ff)' '
464
465
test_debug 'git log --graph --decorate --oneline --all'
466
467
+test_expect_success 'merge c0 with c1 (merge.ff=false)' '
468
+ git reset --hard c0 &&
469
+ git config merge.ff false &&
470
+ test_tick &&
471
+ git merge c1 &&
472
+ git config --remove-section merge &&
473
+ verify_merge file result.1 &&
474
+ verify_parents $c0 $c1
475
+'
476
+test_debug 'git log --graph --decorate --oneline --all'
477
+
478
+test_expect_success 'combine branch.master.mergeoptions with merge.ff' '
479
+ git reset --hard c0 &&
480
+ git config branch.master.mergeoptions --ff
481
+ git config merge.ff false
482
+ test_tick &&
483
+ git merge c1 &&
484
+ git config --remove-section "branch.master" &&
485
+ git config --remove-section "merge" &&
486
+ verify_merge file result.1 &&
487
+ verify_parents "$c0"
488
+'
489
+
490
test_expect_success 'combining --squash and --no-ff is refused' '
491
test_must_fail git merge --squash --no-ff c1 &&
492
test_must_fail git merge --no-ff --squash c1