When cherry-pick fails after picking a large series of commits, it can be hard to pick out the error message and advice. Prefix the advice with “hint: ” to help. Before: error: could not apply 7ab78c9... foo After resolving the conflicts, mark the corrected paths with 'git add <paths>' or 'git rm <paths>' and commit the result with: git commit -c 7ab78c9a7898b87127365478431289cb98f8d98f After: error: could not apply 7ab78c9... foo hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit -c 7ab78c9' Noticed-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> Encouraged-by: Sverre Rabbelier <srabbelier@xxxxxxxxx> Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- Thanks for reading. builtin/revert.c | 36 ++++++++++++------------------------ git-rebase--interactive.sh | 6 +++--- t/t3507-cherry-pick-conflict.sh | 20 ++++++++++++++++++++ 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/builtin/revert.c b/builtin/revert.c index 9a7483b..7f35cc6 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -250,27 +250,21 @@ static void advise(const char *advice, ...) va_end(params); } -static char *help_msg(void) +static void print_advice(void) { - struct strbuf helpbuf = STRBUF_INIT; char *msg = getenv("GIT_CHERRY_PICK_HELP"); - if (msg) - return msg; - - strbuf_addstr(&helpbuf, " After resolving the conflicts,\n" - "mark the corrected paths with 'git add <paths>' or 'git rm <paths>'\n" - "and commit the result"); - - if (action == CHERRY_PICK) { - strbuf_addf(&helpbuf, " with: \n" - "\n" - " git commit -c %s\n", - sha1_to_hex(commit->object.sha1)); + if (msg) { + fprintf(stderr, "%s\n", msg); + return; } - else - strbuf_addch(&helpbuf, '.'); - return strbuf_detach(&helpbuf, NULL); + + advise("after resolving the conflicts, mark the corrected paths"); + advise("with 'git add <paths>' or 'git rm <paths>'"); + + if (action == CHERRY_PICK) + advise("and commit the result with 'git commit -c %s'", + find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV)); } static void write_message(struct strbuf *msgbuf, const char *filename) @@ -404,7 +398,6 @@ static int do_pick_commit(void) struct commit_message msg = { NULL, NULL, NULL, NULL, NULL }; char *defmsg = NULL; struct strbuf msgbuf = STRBUF_INIT; - struct strbuf mebuf = STRBUF_INIT; int res; if (no_commit) { @@ -501,9 +494,6 @@ static int do_pick_commit(void) } } - strbuf_addf(&mebuf, "%s of commit %s", me, - find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV)); - if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) { res = do_recursive_merge(base, next, base_label, next_label, head, &msgbuf); @@ -512,7 +502,6 @@ static int do_pick_commit(void) struct commit_list *common = NULL; struct commit_list *remotes = NULL; - strbuf_addf(&mebuf, " with strategy %s", strategy); write_message(&msgbuf, defmsg); commit_list_insert(base, &common); @@ -528,14 +517,13 @@ static int do_pick_commit(void) action == REVERT ? "revert" : "apply", find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), msg.subject); - fprintf(stderr, help_msg()); + print_advice(); rerere(allow_rerere_auto); } else { if (!no_commit) res = run_git_commit(defmsg); } - strbuf_release(&mebuf); free_message(&msg); free(defmsg); diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 31e6860..8f6876d 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -113,9 +113,9 @@ REBASE_ROOT= AUTOSQUASH= NEVER_FF= -GIT_CHERRY_PICK_HELP=" After resolving the conflicts, -mark the corrected paths with 'git add <paths>', and -run 'git rebase --continue'" +GIT_CHERRY_PICK_HELP="\ +hint: after resolving the conflicts, mark the corrected paths +hint: with 'git add <paths>' and run 'git rebase --continue'" export GIT_CHERRY_PICK_HELP warn () { diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh index e25cf80..3f29594 100755 --- a/t/t3507-cherry-pick-conflict.sh +++ b/t/t3507-cherry-pick-conflict.sh @@ -38,6 +38,26 @@ test_expect_success 'failed cherry-pick does not advance HEAD' ' test "$head" = "$newhead" ' +test_expect_success 'advice from failed cherry-pick' ' + git checkout -f initial^0 && + git read-tree -u --reset HEAD && + git clean -d -f -f -q -x && + + git update-index --refresh && + git diff-index --exit-code HEAD && + + picked=$(git rev-parse --short picked) && + cat <<-EOF >expected && + error: could not apply $picked... picked + hint: after resolving the conflicts, mark the corrected paths + hint: with 'git add <paths>' or 'git rm <paths>' + hint: and commit the result with 'git commit -c $picked' + EOF + test_must_fail git cherry-pick picked 2>actual && + + test_cmp expected actual +' + test_expect_success 'failed cherry-pick produces dirty index' ' git checkout -f initial^0 && -- 1.7.2.1.544.ga752d.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