summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/git-checkout.txt10
-rw-r--r--builtin-checkout.c10
-rwxr-xr-xt/t7201-co.sh100
3 files changed, 72 insertions, 48 deletions
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index c884862e2f..13b106d626 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -9,7 +9,7 @@ SYNOPSIS
--------
[verse]
'git checkout' [-q] [-f] [[--track | --no-track] -b <new_branch> [-l]] [-m] [<branch>]
-'git checkout' [-f|--ours|--theirs|-m] [<tree-ish>] [--] <paths>...
+'git checkout' [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
DESCRIPTION
-----------
@@ -84,6 +84,7 @@ entries; instead, unmerged entries are ignored.
based sha1 expressions such as "<branchname>@\{yesterday}".
-m::
+--merge::
When switching branches,
if you have local modifications to one or more files that
are different between the current branch and the branch to
@@ -101,6 +102,13 @@ should result in deletion of the path).
When checking out paths from the index, this option lets you recreate
the conflicted merge in the specified paths.
+--conflict=<style>::
+ The same as --merge option above, but changes the way the
+ conflicting hunks are presented, overriding the
+ merge.conflictstyle configuration variable. Possible values are
+ "merge" (default) and "diff3" (in addition to what is shown by
+ "merge" style, shows the original contents).
+
<new_branch>::
Name for the new branch.
diff --git a/builtin-checkout.c b/builtin-checkout.c
index b957193155..79214327b0 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -580,6 +580,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
const char *arg;
struct branch_info new;
struct tree *source_tree = NULL;
+ char *conflict_style = NULL;
struct option options[] = {
OPT__QUIET(&opts.quiet),
OPT_STRING('b', NULL, &opts.new_branch, "new branch", "branch"),
@@ -591,7 +592,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
3),
OPT_BOOLEAN('f', NULL, &opts.force, "force"),
- OPT_BOOLEAN('m', NULL, &opts.merge, "merge"),
+ OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
+ OPT_STRING(0, "conflict", &conflict_style, "style",
+ "conflict style (merge or diff3)"),
OPT_END(),
};
int has_dash_dash;
@@ -606,6 +609,11 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, options, checkout_usage,
PARSE_OPT_KEEP_DASHDASH);
+ if (conflict_style) {
+ opts.merge = 1; /* implied */
+ git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
+ }
+
if (!opts.new_branch && (opts.track != git_branch_track))
die("git checkout: --track and --no-track require -b");
diff --git a/t/t7201-co.sh b/t/t7201-co.sh
index 1d4ff6e8d3..ac49311cf2 100755
--- a/t/t7201-co.sh
+++ b/t/t7201-co.sh
@@ -337,7 +337,7 @@ test_expect_success \
test refs/heads/delete-me = "$(git symbolic-ref HEAD)" &&
test_must_fail git checkout --track -b track'
-test_expect_success 'checkout an unmerged path should fail' '
+setup_conflicting_index () {
rm -f .git/index &&
O=$(echo original | git hash-object -w --stdin) &&
A=$(echo ourside | git hash-object -w --stdin) &&
@@ -348,7 +348,11 @@ test_expect_success 'checkout an unmerged path should fail' '
echo "100644 $A 2 file" &&
echo "100644 $B 3 file" &&
echo "100644 $A 0 filf"
- ) | git update-index --index-info &&
+ ) | git update-index --index-info
+}
+
+test_expect_success 'checkout an unmerged path should fail' '
+ setup_conflicting_index &&
echo "none of the above" >sample &&
cat sample >fild &&
cat sample >file &&
@@ -360,17 +364,7 @@ test_expect_success 'checkout an unmerged path should fail' '
'
test_expect_success 'checkout with an unmerged path can be ignored' '
- rm -f .git/index &&
- O=$(echo original | git hash-object -w --stdin) &&
- A=$(echo ourside | git hash-object -w --stdin) &&
- B=$(echo theirside | git hash-object -w --stdin) &&
- (
- echo "100644 $A 0 fild" &&
- echo "100644 $O 1 file" &&
- echo "100644 $A 2 file" &&
- echo "100644 $B 3 file" &&
- echo "100644 $A 0 filf"
- ) | git update-index --index-info &&
+ setup_conflicting_index &&
echo "none of the above" >sample &&
echo ourside >expect &&
cat sample >fild &&
@@ -383,17 +377,7 @@ test_expect_success 'checkout with an unmerged path can be ignored' '
'
test_expect_success 'checkout unmerged stage' '
- rm -f .git/index &&
- O=$(echo original | git hash-object -w --stdin) &&
- A=$(echo ourside | git hash-object -w --stdin) &&
- B=$(echo theirside | git hash-object -w --stdin) &&
- (
- echo "100644 $A 0 fild" &&
- echo "100644 $O 1 file" &&
- echo "100644 $A 2 file" &&
- echo "100644 $B 3 file" &&
- echo "100644 $A 0 filf"
- ) | git update-index --index-info &&
+ setup_conflicting_index &&
echo "none of the above" >sample &&
echo ourside >expect &&
cat sample >fild &&
@@ -408,17 +392,7 @@ test_expect_success 'checkout unmerged stage' '
'
test_expect_success 'checkout with --merge' '
- rm -f .git/index &&
- O=$(echo original | git hash-object -w --stdin) &&
- A=$(echo ourside | git hash-object -w --stdin) &&
- B=$(echo theirside | git hash-object -w --stdin) &&
- (
- echo "100644 $A 0 fild" &&
- echo "100644 $O 1 file" &&
- echo "100644 $A 2 file" &&
- echo "100644 $B 3 file" &&
- echo "100644 $A 0 filf"
- ) | git update-index --index-info &&
+ setup_conflicting_index &&
echo "none of the above" >sample &&
echo ourside >expect &&
cat sample >fild &&
@@ -439,17 +413,7 @@ test_expect_success 'checkout with --merge' '
test_expect_success 'checkout with --merge, in diff3 -m style' '
git config merge.conflictstyle diff3 &&
- rm -f .git/index &&
- O=$(echo original | git hash-object -w --stdin) &&
- A=$(echo ourside | git hash-object -w --stdin) &&
- B=$(echo theirside | git hash-object -w --stdin) &&
- (
- echo "100644 $A 0 fild" &&
- echo "100644 $O 1 file" &&
- echo "100644 $A 2 file" &&
- echo "100644 $B 3 file" &&
- echo "100644 $A 0 filf"
- ) | git update-index --index-info &&
+ setup_conflicting_index &&
echo "none of the above" >sample &&
echo ourside >expect &&
cat sample >fild &&
@@ -470,4 +434,48 @@ test_expect_success 'checkout with --merge, in diff3 -m style' '
test_cmp merged file
'
+test_expect_success 'checkout --conflict=merge, overriding config' '
+ git config merge.conflictstyle diff3 &&
+ setup_conflicting_index &&
+ echo "none of the above" >sample &&
+ echo ourside >expect &&
+ cat sample >fild &&
+ cat sample >file &&
+ cat sample >filf &&
+ git checkout --conflict=merge -- fild file filf &&
+ (
+ echo "<<<<<<< ours"
+ echo ourside
+ echo "======="
+ echo theirside
+ echo ">>>>>>> theirs"
+ ) >merged &&
+ test_cmp expect fild &&
+ test_cmp expect filf &&
+ test_cmp merged file
+'
+
+test_expect_success 'checkout --conflict=diff3' '
+ git config --unset merge.conflictstyle
+ setup_conflicting_index &&
+ echo "none of the above" >sample &&
+ echo ourside >expect &&
+ cat sample >fild &&
+ cat sample >file &&
+ cat sample >filf &&
+ git checkout --conflict=diff3 -- fild file filf &&
+ (
+ echo "<<<<<<< ours"
+ echo ourside
+ echo "|||||||"
+ echo original
+ echo "======="
+ echo theirside
+ echo ">>>>>>> theirs"
+ ) >merged &&
+ test_cmp expect fild &&
+ test_cmp expect filf &&
+ test_cmp merged file
+'
+
test_done