From: Stephan Beyer <s-beyer@xxxxxxx> This option is nearly like "--merge" except that it is a little bit safer as it seems that it tries to keep changes in the index. On the contrary "--merge", only keep changes in the work tree. This will be shown in the next patch that adds some test cases for "--merge-dirty". In fact with "--merge-dirty", changes that are both in the work tree and the index are kept in the work tree after the reset (but discarded in the index). As with "--merge", changes that are in both the work tree and the index are discarded after the reset. So "--merge-dirty" is probably a very bad name for this new option. Perhaps "--merge-safe" is better? The code comes from the sequencer GSoC project: git://repo.or.cz/git/sbeyer.git (at commit 5a78908b70ceb5a4ea9fd4b82f07ceba1f019079) Mentored-by: Daniel Barkalow <barkalow@xxxxxxxxxxxx> Mentored-by: Christian Couder <chriscool@xxxxxxxxxxxxx> Signed-off-by: Stephan Beyer <s-beyer@xxxxxxx> Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin-reset.c | 30 +++++++++++++++++++++++++----- 1 files changed, 25 insertions(+), 5 deletions(-) diff --git a/builtin-reset.c b/builtin-reset.c index ddb81f3..be7aa8d 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -22,13 +22,15 @@ #include "cache-tree.h" static const char * const git_reset_usage[] = { - "git reset [--mixed | --soft | --hard | --merge] [-q] [<commit>]", + "git reset [--mixed | --soft | --hard | --merge | --merge-dirty] [-q] [<commit>]", "git reset [--mixed] <commit> [--] <paths>...", NULL }; -enum reset_type { MIXED, SOFT, HARD, MERGE, NONE }; -static const char *reset_type_names[] = { "mixed", "soft", "hard", "merge", NULL }; +enum reset_type { MIXED, SOFT, HARD, MERGE, MERGE_DIRTY, NONE }; +static const char *reset_type_names[] = { + "mixed", "soft", "hard", "merge", "merge_dirty", NULL +}; static char *args_to_str(const char **argv) { @@ -84,6 +86,7 @@ static int reset_index_file(const unsigned char *sha1, int reset_type, int quiet case MERGE: opts.update = 1; break; + case MERGE_DIRTY: case HARD: opts.update = 1; /* fallthrough */ @@ -95,6 +98,16 @@ static int reset_index_file(const unsigned char *sha1, int reset_type, int quiet read_cache_unmerged(); + if (reset_type == MERGE_DIRTY) { + unsigned char *head_sha1; + if (get_sha1("HEAD", head_sha1)) + return error("You do not have a valid HEAD."); + if (parse_and_init_tree_desc(head_sha1, desc)) + return error("Failed to find tree of HEAD."); + nr++; + opts.fn = twoway_merge; + } + if (parse_and_init_tree_desc(sha1, desc + nr - 1)) return error("Failed to find tree of %s.", sha1_to_hex(sha1)); if (unpack_trees(nr, desc, &opts)) @@ -238,6 +251,9 @@ int cmd_reset(int argc, const char **argv, const char *prefix) "reset HEAD, index and working tree", HARD), OPT_SET_INT(0, "merge", &reset_type, "reset HEAD, index and working tree", MERGE), + OPT_SET_INT(0, "merge-dirty", &reset_type, + "reset HEAD, index and working tree", + MERGE_DIRTY), OPT_BOOLEAN('q', NULL, &quiet, "disable showing new HEAD in hard reset and progress message"), OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"), @@ -324,9 +340,13 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type == SOFT) { if (is_merge() || read_cache() < 0 || unmerged_cache()) die("Cannot do a soft reset in the middle of a merge."); + } else { + int err = reset_index_file(sha1, reset_type, quiet); + if (reset_type == MERGE_DIRTY) + err = err || reset_index_file(sha1, MIXED, quiet); + if (err) + die("Could not reset index file to revision '%s'.", rev); } - else if (reset_index_file(sha1, reset_type, quiet)) - die("Could not reset index file to revision '%s'.", rev); /* Any resets update HEAD to the head being switched to, * saving the previous head in ORIG_HEAD before. */ -- 1.6.4.271.ge010d -- 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