Browse Source

Merge branch 'bg/merge-ff-only'

* bg/merge-ff-only:
  Teach 'git merge' and 'git pull' the option --ff-only
maint
Junio C Hamano 15 years ago
parent
commit
3cc335181f
  1. 5
      Documentation/merge-options.txt
  2. 11
      builtin-merge.c
  3. 7
      git-pull.sh
  4. 41
      t/t7600-merge.sh

5
Documentation/merge-options.txt

@ -49,6 +49,11 @@ merge. @@ -49,6 +49,11 @@ merge.
With --no-squash perform the merge and commit the result. This
option can be used to override --squash.

--ff-only::
Refuse to merge and exit with a non-zero status unless the
current `HEAD` is already up-to-date or the merge can be
resolved as a fast-forward.

-s <strategy>::
--strategy=<strategy>::
Use the given merge strategy; can be supplied more than

11
builtin-merge.c

@ -43,6 +43,7 @@ static const char * const builtin_merge_usage[] = { @@ -43,6 +43,7 @@ static const char * const builtin_merge_usage[] = {

static int show_diffstat = 1, option_log, squash;
static int option_commit = 1, allow_fast_forward = 1;
static int fast_forward_only;
static int allow_trivial = 1, have_message;
static struct strbuf merge_msg;
static struct commit_list *remoteheads;
@ -167,6 +168,8 @@ static struct option builtin_merge_options[] = { @@ -167,6 +168,8 @@ static struct option builtin_merge_options[] = {
"perform a commit if the merge succeeds (default)"),
OPT_BOOLEAN(0, "ff", &allow_fast_forward,
"allow fast forward (default)"),
OPT_BOOLEAN(0, "ff-only", &fast_forward_only,
"abort if fast forward is not possible"),
OPT_CALLBACK('s', "strategy", &use_strategies, "strategy",
"merge strategy to use", option_parse_strategy),
OPT_CALLBACK('m', "message", &merge_msg, "message",
@ -877,6 +880,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix) @@ -877,6 +880,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
option_commit = 0;
}

if (!allow_fast_forward && fast_forward_only)
die("You cannot combine --no-ff with --ff-only.");

if (!argc)
usage_with_options(builtin_merge_usage,
builtin_merge_options);
@ -1043,7 +1049,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) @@ -1043,7 +1049,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
* only one common.
*/
refresh_cache(REFRESH_QUIET);
if (allow_trivial) {
if (allow_trivial && !fast_forward_only) {
/* See if it is really trivial. */
git_committer_info(IDENT_ERROR_ON_NO_NAME);
printf("Trying really trivial in-index merge...\n");
@ -1082,6 +1088,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix) @@ -1082,6 +1088,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
}
}

if (fast_forward_only)
die("Not possible to fast forward, aborting.");

/* We are going to make a new commit. */
git_committer_info(IDENT_ERROR_ON_NO_NAME);


7
git-pull.sh

@ -16,7 +16,8 @@ cd_to_toplevel @@ -16,7 +16,8 @@ cd_to_toplevel
test -z "$(git ls-files -u)" ||
die "You are in the middle of a conflicted merge."

strategy_args= diffstat= no_commit= squash= no_ff= log_arg= verbosity=
strategy_args= diffstat= no_commit= squash= no_ff= ff_only=
log_arg= verbosity=
curr_branch=$(git symbolic-ref -q HEAD)
curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
rebase=$(git config --bool branch.$curr_branch_short.rebase)
@ -45,6 +46,8 @@ do @@ -45,6 +46,8 @@ do
no_ff=--ff ;;
--no-ff)
no_ff=--no-ff ;;
--ff-only)
ff_only=--ff-only ;;
-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
--strateg=*|--strategy=*|\
-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
@ -215,5 +218,5 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit @@ -215,5 +218,5 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
test true = "$rebase" &&
exec git-rebase $diffstat $strategy_args --onto $merge_head \
${oldremoteref:-$merge_head}
exec git-merge $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \
exec git-merge $diffstat $no_commit $squash $no_ff $ff_only $log_arg $strategy_args \
"$merge_name" HEAD $merge_head $verbosity

41
t/t7600-merge.sh

@ -243,6 +243,16 @@ test_expect_success 'merge c0 with c1' ' @@ -243,6 +243,16 @@ test_expect_success 'merge c0 with c1' '

test_debug 'gitk --all'

test_expect_success 'merge c0 with c1 with --ff-only' '
git reset --hard c0 &&
git merge --ff-only c1 &&
git merge --ff-only HEAD c0 c1 &&
verify_merge file result.1 &&
verify_head "$c1"
'

test_debug 'gitk --all'

test_expect_success 'merge c1 with c2' '
git reset --hard c1 &&
test_tick &&
@ -263,6 +273,14 @@ test_expect_success 'merge c1 with c2 and c3' ' @@ -263,6 +273,14 @@ test_expect_success 'merge c1 with c2 and c3' '

test_debug 'gitk --all'

test_expect_success 'failing merges with --ff-only' '
git reset --hard c1 &&
test_tick &&
test_must_fail git merge --ff-only c2 &&
test_must_fail git merge --ff-only c3 &&
test_must_fail git merge --ff-only c2 c3
'

test_expect_success 'merge c0 with c1 (no-commit)' '
git reset --hard c0 &&
git merge --no-commit c1 &&
@ -303,6 +321,17 @@ test_expect_success 'merge c0 with c1 (squash)' ' @@ -303,6 +321,17 @@ test_expect_success 'merge c0 with c1 (squash)' '

test_debug 'gitk --all'

test_expect_success 'merge c0 with c1 (squash, ff-only)' '
git reset --hard c0 &&
git merge --squash --ff-only c1 &&
verify_merge file result.1 &&
verify_head $c0 &&
verify_no_mergehead &&
verify_diff squash.1 .git/SQUASH_MSG "[OOPS] bad squash message"
'

test_debug 'gitk --all'

test_expect_success 'merge c1 with c2 (squash)' '
git reset --hard c1 &&
git merge --squash c2 &&
@ -314,6 +343,13 @@ test_expect_success 'merge c1 with c2 (squash)' ' @@ -314,6 +343,13 @@ test_expect_success 'merge c1 with c2 (squash)' '

test_debug 'gitk --all'

test_expect_success 'unsuccesful merge of c1 with c2 (squash, ff-only)' '
git reset --hard c1 &&
test_must_fail git merge --squash --ff-only c2
'

test_debug 'gitk --all'

test_expect_success 'merge c1 with c2 and c3 (squash)' '
git reset --hard c1 &&
git merge --squash c2 c3 &&
@ -432,6 +468,11 @@ test_expect_success 'combining --squash and --no-ff is refused' ' @@ -432,6 +468,11 @@ test_expect_success 'combining --squash and --no-ff is refused' '
test_must_fail git merge --no-ff --squash c1
'

test_expect_success 'combining --ff-only and --no-ff is refused' '
test_must_fail git merge --ff-only --no-ff c1 &&
test_must_fail git merge --no-ff --ff-only c1
'

test_expect_success 'merge c0 with c1 (ff overrides no-ff)' '
git reset --hard c0 &&
git config branch.master.mergeoptions "--no-ff" &&

Loading…
Cancel
Save