summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2019-06-17 10:15:17 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2019-06-17 10:15:17 -0700
commit6e0b1c60ad3e6067d5cae51a7dc36e58184accd5 (patch)
tree030db59bb6a9b059c1cc968e80bcc6fd7dfcabfe
parentMerge branch 'js/bundle-verify-require-object-store' (diff)
parentmerge: refuse --commit with --squash (diff)
downloadtgif-6e0b1c60ad3e6067d5cae51a7dc36e58184accd5.tar.xz
Merge branch 'vv/merge-squash-with-explicit-commit'
"git merge --squash" is designed to update the working tree and the index without creating the commit, and this cannot be countermanded by adding the "--commit" option; the command now refuses to work when both options are given. * vv/merge-squash-with-explicit-commit: merge: refuse --commit with --squash
-rw-r--r--Documentation/merge-options.txt2
-rw-r--r--builtin/merge.c12
-rwxr-xr-xt/t7600-merge.sh6
3 files changed, 19 insertions, 1 deletions
diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 61876dbc33..79a00d2a4a 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -102,6 +102,8 @@ merge.
+
With --no-squash perform the merge and commit the result. This
option can be used to override --squash.
++
+With --squash, --commit is not allowed, and will fail.
-s <strategy>::
--strategy=<strategy>::
diff --git a/builtin/merge.c b/builtin/merge.c
index 5c83f89cc6..6e99aead46 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -59,7 +59,7 @@ static const char * const builtin_merge_usage[] = {
};
static int show_diffstat = 1, shortlog_len = -1, squash;
-static int option_commit = 1;
+static int option_commit = -1;
static int option_edit = -1;
static int allow_trivial = 1, have_message, verify_signatures;
static int overwrite_ignore = 1;
@@ -1345,9 +1345,19 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
if (squash) {
if (fast_forward == FF_NO)
die(_("You cannot combine --squash with --no-ff."));
+ if (option_commit > 0)
+ die(_("You cannot combine --squash with --commit."));
+ /*
+ * squash can now silently disable option_commit - this is not
+ * a problem as it is only overriding the default, not a user
+ * supplied option.
+ */
option_commit = 0;
}
+ if (option_commit < 0)
+ option_commit = 1;
+
if (!argc) {
if (default_to_upstream)
argc = setup_with_upstream(&argv);
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 612ebe7d82..132608879a 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -570,6 +570,12 @@ test_expect_success 'combining --squash and --no-ff is refused' '
test_must_fail git merge --no-ff --squash c1
'
+test_expect_success 'combining --squash and --commit is refused' '
+ git reset --hard c0 &&
+ test_must_fail git merge --squash --commit c1 &&
+ test_must_fail git merge --commit --squash c1
+'
+
test_expect_success 'option --ff-only overwrites --no-ff' '
git merge --no-ff --ff-only c1 &&
test_must_fail git merge --no-ff --ff-only c2