Give "reset --hard" a -f (force) flag, without which it will refuse to proceed if there are changes in the index or working tree. Signed-off-by: Steven Walter <stevenrwalter@xxxxxxxxx> --- builtin-reset.c | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-) diff --git a/builtin-reset.c b/builtin-reset.c index f34acb1..6ee8448 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -11,8 +11,10 @@ #include "tag.h" #include "object.h" #include "commit.h" +#include "diff.h" #include "run-command.h" #include "refs.h" +#include "revision.h" #include "diff.h" #include "diffcore.h" #include "tree.h" @@ -165,12 +167,26 @@ static void prepend_reflog_action(const char *action, char *buf, size_t size) warning("Reflog action message too long: %.*s...", 50, buf); } +/* Stolen from builtin-revert.c... */ +static int index_is_dirty(void) +{ + struct rev_info rev; + read_cache(); + init_revisions(&rev, NULL); + setup_revisions(0, NULL, &rev, "HEAD"); + DIFF_OPT_SET(&rev.diffopt, QUIET); + DIFF_OPT_SET(&rev.diffopt, EXIT_WITH_STATUS); + run_diff_files(&rev, 1); + return !!DIFF_OPT_TST(&rev.diffopt, HAS_CHANGES); +} + 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; + int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0, + force = 0; const char *rev = "HEAD"; unsigned char sha1[20], *orig = NULL, sha1_orig[20], *old_orig = NULL, sha1_old_orig[20]; @@ -184,6 +200,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix) "reset HEAD, index and working tree", HARD), OPT_BOOLEAN('q', NULL, &quiet, "disable showing new HEAD in hard reset and progress message"), + OPT_BOOLEAN('f', NULL, &force, + "proceed even if there are uncommitted changes"), OPT_END() }; @@ -225,6 +243,10 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type == HARD && is_bare_repository()) die("hard reset makes no sense in a bare repository"); + if (reset_type == HARD && !force && index_is_dirty()) { + die("Uncommitted changes; re-run with -f to trash them"); + } + /* Soft reset does not touch the index file nor the working tree * at all, but requires them in a good order. Other resets reset * the index file to the tree object we are switching to. */ -- 1.5.6.dirty -- 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