Skip to content

Commit

Permalink
Merge branch 'lt/reset-merge'
Browse files Browse the repository at this point in the history
* lt/reset-merge:
  Document "git-reset --merge"
  Add 'merge' mode to 'git reset'
  • Loading branch information
Junio C Hamano committed Dec 29, 2008
2 parents 78d4096 + 1b5b465 commit c32f76f
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
29 changes: 28 additions & 1 deletion Documentation/git-reset.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ git-reset - Reset current HEAD to the specified state
SYNOPSIS
--------
[verse]
'git reset' [--mixed | --soft | --hard] [-q] [<commit>]
'git reset' [--mixed | --soft | --hard | --merge] [-q] [<commit>]
'git reset' [-q] [<commit>] [--] <paths>...

DESCRIPTION
Expand Down Expand Up @@ -45,6 +45,11 @@ OPTIONS
switched to. Any changes to tracked files in the working tree
since <commit> are lost.

--merge::
Resets the index to match the tree recorded by the named commit,
and updates the files that are different between the named commit
and the current commit in the working tree.

-q::
Be quiet, only report errors.

Expand Down Expand Up @@ -152,6 +157,28 @@ tip of the current branch in ORIG_HEAD, so resetting hard to it
brings your index file and the working tree back to that state,
and resets the tip of the branch to that commit.

Undo a merge or pull inside a dirty work tree::
+
------------
$ git pull <1>
Auto-merging nitfol
Merge made by recursive.
nitfol | 20 +++++----
...
$ git reset --merge ORIG_HEAD <2>
------------
+
<1> Even if you may have local modifications in your
working tree, you can safely say "git pull" when you know
that the change in the other branch does not overlap with
them.
<2> After inspecting the result of the merge, you may find
that the change in the other branch is unsatisfactory. Running
"git reset --hard ORIG_HEAD" will let you go back to where you
were, but it will discard your local changes, which you do not
want. "git reset --merge" keeps your local changes.


Interrupted workflow::
+
Suppose you are interrupted by an urgent fix request while you
Expand Down
26 changes: 18 additions & 8 deletions builtin-reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@
#include "parse-options.h"

static const char * const git_reset_usage[] = {
"git reset [--mixed | --soft | --hard] [-q] [<commit>]",
"git reset [--mixed | --soft | --hard | --merge] [-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 };

static char *args_to_str(const char **argv)
{
char *buf = NULL;
Expand All @@ -49,17 +52,25 @@ static inline int is_merge(void)
return !access(git_path("MERGE_HEAD"), F_OK);
}

static int reset_index_file(const unsigned char *sha1, int is_hard_reset, int quiet)
static int reset_index_file(const unsigned char *sha1, int reset_type, int quiet)
{
int i = 0;
const char *args[6];

args[i++] = "read-tree";
if (!quiet)
args[i++] = "-v";
args[i++] = "--reset";
if (is_hard_reset)
switch (reset_type) {
case MERGE:
args[i++] = "-u";
args[i++] = "-m";
break;
case HARD:
args[i++] = "-u";
/* fallthrough */
default:
args[i++] = "--reset";
}
args[i++] = sha1_to_hex(sha1);
args[i] = NULL;

Expand Down Expand Up @@ -169,9 +180,6 @@ static void prepend_reflog_action(const char *action, char *buf, size_t size)
warning("Reflog action message too long: %.*s...", 50, buf);
}

enum reset_type { MIXED, SOFT, HARD, NONE };
static const char *reset_type_names[] = { "mixed", "soft", "hard", NULL };

int cmd_reset(int argc, const char **argv, const char *prefix)
{
int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0;
Expand All @@ -186,6 +194,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
OPT_SET_INT(0, "soft", &reset_type, "reset only HEAD", SOFT),
OPT_SET_INT(0, "hard", &reset_type,
"reset HEAD, index and working tree", HARD),
OPT_SET_INT(0, "merge", &reset_type,
"reset HEAD, index and working tree", MERGE),
OPT_BOOLEAN('q', NULL, &quiet,
"disable showing new HEAD in hard reset and progress message"),
OPT_END()
Expand Down Expand Up @@ -266,7 +276,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
if (is_merge() || read_cache() < 0 || unmerged_cache())
die("Cannot do a soft reset in the middle of a merge.");
}
else if (reset_index_file(sha1, (reset_type == HARD), quiet))
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,
Expand Down

0 comments on commit c32f76f

Please sign in to comment.