Nanako Shiraishi [off-list ref] 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 <redacted>
---
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