status/commit: do not suggest "reset HEAD <path>" while merging
authorJunio C Hamano <gitster@pobox.com>
Sat, 12 Dec 2009 07:53:41 +0000 (23:53 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 12 Dec 2009 09:22:10 +0000 (01:22 -0800)
Suggesting "'reset HEAD <path>' to unstage" is dead wrong if we are about
to record a merge commit.  For either an unmerged path (i.e. with
unresolved conflicts), or an updated path, it would result in discarding
what the other branch did.

Note that we do not do anything special in a case where we are amending a
merge.  The user is making an evil merge starting from an already
committed merge, and running "reset HEAD <path>" is the right way to get
rid of the local edit that has been added to the index.

Once "reset --unresolve <path>" becomes available, we might want to
suggest it for a merged path that has unresolve information, but until
then, just remove the incorrect advice.

We might also want to suggest "checkout --conflict <path>" to revert the
file in the work tree to the state of failed automerge for an unmerged
path, but we never did that, and this commit does not change that.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-commit.c
t/t7060-wtstatus.sh
wt-status.c
wt-status.h

index 17dd46217341694110eb0876257f5abd803f470c..7218454d1e602d28e79edd2c04f436062fa8a5bc 100644 (file)
@@ -960,6 +960,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
        read_cache();
        refresh_cache(REFRESH_QUIET|REFRESH_UNMERGED);
        s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
+       s.in_merge = in_merge;
        wt_status_collect(&s);
 
        if (s.relative_paths)
@@ -1056,6 +1057,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        wt_status_prepare(&s);
        git_config(git_commit_config, &s);
        in_merge = file_exists(git_path("MERGE_HEAD"));
+       s.in_merge = in_merge;
 
        if (s.use_color == -1)
                s.use_color = git_use_color_default;
index 0919ec46f67d47f536c2fe68c783e02aeb384c86..fcac4725982096af98414c5d40df2d4c14be9454 100755 (executable)
@@ -31,7 +31,6 @@ test_expect_success 'Report new path with conflict' '
 cat >expect <<EOF
 # On branch side
 # Unmerged paths:
-#   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #      deleted by us:      foo
index 56cd8741c0ea0335f0f6e0563d69972916587cd4..c4589055bb7d6b8e945477d09e0015fe2da349af 100644 (file)
@@ -47,8 +47,11 @@ void wt_status_prepare(struct wt_status *s)
 static void wt_status_print_unmerged_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Unmerged paths:");
-       if (!s->is_initial)
+       if (s->in_merge)
+               ;
+       else if (!s->is_initial)
                color_fprintf_ln(s->fp, c, "#   (use \"git reset %s <file>...\" to unstage)", s->reference);
        else
                color_fprintf_ln(s->fp, c, "#   (use \"git rm --cached <file>...\" to unstage)");
@@ -59,12 +62,14 @@ static void wt_status_print_unmerged_header(struct wt_status *s)
 static void wt_status_print_cached_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Changes to be committed:");
-       if (!s->is_initial) {
+       if (s->in_merge)
+               ; /* NEEDSWORK: use "git reset --unresolve"??? */
+       else if (!s->is_initial)
                color_fprintf_ln(s->fp, c, "#   (use \"git reset %s <file>...\" to unstage)", s->reference);
-       } else {
+       else
                color_fprintf_ln(s->fp, c, "#   (use \"git rm --cached <file>...\" to unstage)");
-       }
        color_fprintf_ln(s->fp, c, "#");
 }
 
@@ -72,6 +77,7 @@ static void wt_status_print_dirty_header(struct wt_status *s,
                                         int has_deleted)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Changed but not updated:");
        if (!has_deleted)
                color_fprintf_ln(s->fp, c, "#   (use \"git add <file>...\" to update what will be committed)");
index a4bddcf8db5840de33c10be80864084fc596ea24..c60f40a34a89ccdacdc864203d4441cf3e20bcc5 100644 (file)
@@ -34,6 +34,7 @@ struct wt_status {
        const char **pathspec;
        int verbose;
        int amend;
+       int in_merge;
        int nowarn;
        int use_color;
        int relative_paths;