Many times now, I have seen novices do the following: 1. Start work on their own personal topic branch 2. Push the branch to origin 3. Rebase the branch onto origin/master 4. Try to push again, but Git says they need to pull 5. Pull and make a mess trying to reconcile the older topic branch with the rebased topic branch Help avoid this mistake by giving advice that mentions force-pushing, rather than assuming that the user always wants to do reconciliation. Changes from v2: - Switch back to recommending plain --force in these cases - Use Junio's proposed wording in remote.c Alex Henrie (2): remote: advise about force-pushing as an alternative to reconciliation push: advise about force-pushing as an alternative to reconciliation builtin/push.c | 27 +++++++++++++++------------ remote.c | 5 ++++- 2 files changed, 19 insertions(+), 13 deletions(-) Range-diff against v2: 1: d0cb607225 < -: ---------- remote: advise about force-pushing as an alternative to reconciliation -: ---------- > 1: 9cbf5f138e remote: advise about force-pushing as an alternative to reconciliation 2: 3295f0bb2b ! 2: 727e1f7636 push: advise about force-pushing as an alternative to reconciliation @@ builtin/push.c: static void setup_default_push_refspecs(int *flags, struct remot - "its remote counterpart. Integrate the remote changes (e.g.\n" - "'git pull ...') before pushing again.\n" + "its remote counterpart. Use 'git pull' to integrate the remote changes\n" -+ "before pushing again, or use 'git push --force-with-lease' to delete the\n" -+ "remote changes and replace them with your own.\n" ++ "before pushing again, or use 'git push --force' to delete the remote\n" ++ "changes and replace them with your own.\n" "See the 'Note about fast-forwards' in 'git push --help' for details."); static const char message_advice_checkout_pull_push[] = @@ builtin/push.c: static void setup_default_push_refspecs(int *flags, struct remot - "counterpart. Check out this branch and integrate the remote changes\n" - "(e.g. 'git pull ...') before pushing again.\n" + "counterpart. Check out this branch and use 'git pull' to integrate the\n" -+ "remote changes before pushing again, or use\n" -+ "'git push --force-with-lease' to delete the remote changes and replace\n" -+ "them with your own.\n" ++ "remote changes before pushing again, or use 'git push --force' to delete\n" ++ "the remote changes and replace them with your own.\n" "See the 'Note about fast-forwards' in 'git push --help' for details."); static const char message_advice_ref_fetch_first[] = @@ builtin/push.c: static void setup_default_push_refspecs(int *flags, struct remot + N_("Updates were rejected because the remote contains work that you do not\n" + "have locally. This is usually caused by another repository pushing to\n" + "the same ref. Use 'git pull' to integrate the remote changes before\n" -+ "pushing again, or use 'git push --force-with-lease' to delete the\n" -+ "remote changes and replace them with your own.\n" ++ "pushing again, or use 'git push --force' to delete the remote changes\n" ++ "and replace them with your own.\n" "See the 'Note about fast-forwards' in 'git push --help' for details."); static const char message_advice_ref_already_exists[] = @@ builtin/push.c: static const char message_advice_ref_needs_force[] = - "before forcing an update.\n"); + N_("Updates were rejected because the tip of the remote-tracking branch has\n" + "been updated since the last checkout. Use 'git pull' to integrate the\n" -+ "remote changes before pushing again, or use\n" -+ "'git push --force-with-lease' to delete the remote changes and replace\n" -+ "them with your own.\n"); ++ "remote changes before pushing again, or use 'git push --force' to delete\n" ++ "the remote changes and replace them with your own.\n"); static void advise_pull_before_push(void) { -- 2.41.0