Nanako Shiraishi <nanako3@xxxxxxxxxxx> writes: > the change breaks --squash to merge a branch, doesn't it? > > % git checkout feature # from your master branch > % work; git commit; work; git commit > % git checkout master # go back to your master branch > % git merge --squash feature > > This is a useful way to clean up changes that were built > in small steps that turned out to be worth only a commit. Incidentally we seemed to have seen an end user request for exactly this workflow. A reroll has been queued, as below, with an update to a test script that expects --no-commit to be a no-op for fast-forward. -- >8 -- Traditionally "git merge --no-commit" meant just that: do not create a new commit even when a merge succeeds. But this leads to confusion when the merged commit is a descendant of the current commit, in which case we succeed the merge by fast-forwarding and without creating a new commit. Also when the merged commit is already a part of the history, we succeeded without doing anything. Error out when --no-commit is given but the merge would result in a fast-forward or an up-to-date. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- builtin-merge.c | 11 +++++++++++ t/t7600-merge.sh | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/builtin-merge.c b/builtin-merge.c index b6b8428..2149aed 100644 --- a/builtin-merge.c +++ b/builtin-merge.c @@ -829,6 +829,12 @@ static int evaluate_result(void) return cnt; } +static void check_no_commit(const char *msg) +{ + if (!option_commit) + die("The merge will %s but --no-commit was given.", msg); +} + int cmd_merge(int argc, const char **argv, const char *prefix) { unsigned char result_tree[20]; @@ -996,6 +1002,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * If head can reach all the merge then we are up to date. * but first the most common case of merging one remote. */ + check_no_commit("be a no-op because you are up-to-date"); finish_up_to_date("Already up-to-date."); return 0; } else if (allow_fast_forward && !remoteheads->next && @@ -1006,6 +1013,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix) struct object *o; char hex[41]; + if (allow_fast_forward && !squash) + check_no_commit("fast forward"); + strcpy(hex, find_unique_abbrev(head, DEFAULT_ABBREV)); if (verbosity >= 0) @@ -1074,6 +1084,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) } } if (up_to_date) { + check_no_commit("be a no-op because you are up-to-date"); finish_up_to_date("Already up-to-date. Yeeah!"); return 0; } diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index e5b210b..86b0537 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -265,9 +265,7 @@ test_debug 'gitk --all' test_expect_success 'merge c0 with c1 (no-commit)' ' git reset --hard c0 && - git merge --no-commit c1 && - verify_merge file result.1 && - verify_head $c1 + test_must_fail git merge --no-commit c1 ' test_debug 'gitk --all' -- 1.6.5.1.124.g746fb6 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html