diff --git a/builtin/checkout.c b/builtin/checkout.c index 0e5d1af75b..30d13c9e14 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -100,7 +100,7 @@ struct checkout_opts { struct tree *source_tree; }; -#define CHECKOUT_OPTS_INIT { .conflict_style = -1 } +#define CHECKOUT_OPTS_INIT { .conflict_style = -1, .merge = -1 } struct branch_info { char *name; /* The short name used */ @@ -1633,6 +1633,9 @@ static int parse_opt_conflict(const struct option *o, const char *arg, int unset opts->conflict_style = parse_conflict_style_name(arg); if (opts->conflict_style < 0) return error(_("unknown conflict style '%s'"), arg); + /* --conflict overrides a previous --no-merge */ + if (!opts->merge) + opts->merge = -1; return 0; } @@ -1740,8 +1743,9 @@ static int checkout_main(int argc, const char **argv, const char *prefix, opts->show_progress = isatty(2); } - if (opts->conflict_style >= 0) - opts->merge = 1; /* implied */ + /* --conflicts implies --merge */ + if (opts->merge == -1) + opts->merge = opts->conflict_style >= 0; if (opts->force) { opts->discard_changes = 1; diff --git a/t/t7201-co.sh b/t/t7201-co.sh index e1f85a9156..42352dc0db 100755 --- a/t/t7201-co.sh +++ b/t/t7201-co.sh @@ -631,6 +631,66 @@ test_expect_success 'checkout --conflict=diff3' ' test_cmp merged file ' +test_expect_success 'checkout --conflict=diff3 --no-conflict does not merge' ' + setup_conflicting_index && + echo "none of the above" >expect && + cat expect >fild && + cat expect >file && + test_must_fail git checkout --conflict=diff3 --no-conflict -- fild file 2>err && + test_cmp expect file && + test_cmp expect fild && + echo "error: path ${SQ}file${SQ} is unmerged" >expect && + test_cmp expect err +' + +test_expect_success 'checkout --conflict=diff3 --no-merge does not merge' ' + setup_conflicting_index && + echo "none of the above" >expect && + cat expect >fild && + cat expect >file && + test_must_fail git checkout --conflict=diff3 --no-merge -- fild file 2>err && + test_cmp expect file && + test_cmp expect fild && + echo "error: path ${SQ}file${SQ} is unmerged" >expect && + test_cmp expect err +' + +test_expect_success 'checkout --no-merge --conflict=diff3 does merge' ' + setup_conflicting_index && + echo "none of the above" >fild && + echo "none of the above" >file && + git checkout --no-merge --conflict=diff3 -- fild file && + echo "ourside" >expect && + test_cmp expect fild && + cat >expect <<-\EOF && + <<<<<<< ours + ourside + ||||||| base + original + ======= + theirside + >>>>>>> theirs + EOF + test_cmp expect file +' + +test_expect_success 'checkout --merge --conflict=diff3 --no-conflict does merge' ' + setup_conflicting_index && + echo "none of the above" >fild && + echo "none of the above" >file && + git checkout --merge --conflict=diff3 --no-conflict -- fild file && + echo "ourside" >expect && + test_cmp expect fild && + cat >expect <<-\EOF && + <<<<<<< ours + ourside + ======= + theirside + >>>>>>> theirs + EOF + test_cmp expect file +' + test_expect_success 'checkout with invalid conflict style' ' test_must_fail git checkout --conflict=bad 2>actual -- file && echo "error: unknown conflict style ${SQ}bad${SQ}" >expect &&