Diverging branches is one of the most confusing aspects of distributed version control systems for novices, so a little help explaining what to do on those situations will come in handy. Right now this advice will be displayed only when the user does `git merge --ff-only`, `git pull --ff-only`, or has configured `pull.ff=only` for `git pull`, but in the future it's expected that --ff-only will be the default for `git pull`, and a proposed `git fast-forward` command will imply --ff-only, in addition to `git update`. So it makes sense to add the advice in preparation for those future changes, although even currently it helps. Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx> --- advice.c | 11 +++++++++++ advice.h | 1 + builtin/merge.c | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/advice.c b/advice.c index 0b9c89c48a..8f068c8be9 100644 --- a/advice.c +++ b/advice.c @@ -326,3 +326,14 @@ void detach_advice(const char *new_name) fprintf(stderr, fmt, new_name); } + +void diverging_advice(void) +{ + advise(_("Diverging branches can't be fast-forwarded, you need to either:\n" + "\n" + "\tgit merge\n" + "\n" + "or:\n" + "\n" + "\tgit rebase\n")); +} diff --git a/advice.h b/advice.h index bd26c385d0..6ce967c962 100644 --- a/advice.h +++ b/advice.h @@ -97,5 +97,6 @@ void NORETURN die_resolve_conflict(const char *me); void NORETURN die_conclude_merge(void); void advise_on_updating_sparse_paths(struct string_list *pathspec_list); void detach_advice(const char *new_name); +void diverging_advice(void); #endif /* ADVICE_H */ diff --git a/builtin/merge.c b/builtin/merge.c index 05e631229d..56a526f42c 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1619,8 +1619,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix) } } - if (fast_forward == FF_ONLY) + if (fast_forward == FF_ONLY) { + diverging_advice(); die(_("unable to fast-forward")); + } if (autostash) create_autostash(the_repository, -- 2.32.0.40.gb9b36f9b52