--------
[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
-----------
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
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.
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"),
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;
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");
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) &&
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 &&
'
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 &&
'
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 &&
'
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 &&
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 &&
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