git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/4] reset: add option "--merge-dirty" to "git reset"

From
Christian Couder <chriscool@tuxfamily.org>
Date
Sep 10, 2009, 20:23 UTC
Message-ID
<20090910202333.3722.37592.chriscool@tuxfamily.org>
In-Reply-To
<20090910200334.3722.20140.chriscool@tuxfamily.org>
From: Stephan Beyer <s-beyer@gmx.net>

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@iabervon.org>
Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Stephan Beyer <s-beyer@gmx.net>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 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
Previous: Daniel BarkalowNext: Linus Torvalds
Message 11 of 21 in “"git reset --merge" related improvements”
  1. 0/4 "git reset --merge" related improvementsChristian Couder, Sep 10, 2009
  2. 1/4 reset: add a few tests for "git reset --merge"Christian Couder, Sep 10, 2009
  3. Jakub NarebskiSep 10, 2009
  4. Christian CouderSep 11, 2009
  5. Tony FinchSep 13, 2009
  6. 2/4 reset: use "unpack_trees()" directly instead of "git read-tree"Christian Couder, Sep 10, 2009
  7. Junio C HamanoSep 11, 2009
  8. Christian CouderSep 11, 2009
  9. Junio C HamanoSep 11, 2009
  10. Daniel BarkalowSep 11, 2009
  11. 3/4 reset: add option "--merge-dirty" to "git reset"Christian Couder, Sep 10, 2009
  12. Linus TorvaldsSep 10, 2009
  13. Christian CouderSep 11, 2009
  14. Linus TorvaldsSep 11, 2009
  15. Junio C HamanoSep 11, 2009
  16. 4/4 reset: add test cases for "--merge-dirty" optionChristian Couder, Sep 10, 2009
  17. Daniel BarkalowSep 10, 2009
  18. Christian CouderSep 11, 2009
  19. Daniel BarkalowSep 11, 2009
  20. Christian CouderSep 15, 2009
  21. Paolo BonziniSep 13, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.