git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 0/3] don't imply that integration is always required before pushing

From
Alex Henrie <alexhenrie24@gmail.com>
Date
Jul 13, 2023, 04:41 UTC
Message-ID
<20230713044128.3771818-1-alexhenrie24@gmail.com>
In-Reply-To
<20230707054257.3366355-1-alexhenrie24@gmail.com>
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 somewhat more general advice that does not assume that the user always wants to do reconciliation.

Changes from v4:
- Don't show divergent branch advice in the middle of `git commit`
- Soften the advice, but don't specifically mention force-pushing
Alex Henrie (3):
  wt-status: don't show divergence advice when committing
  remote: don't imply that integration is always required before pushing
  push: don't imply that integration is always required before pushing
 builtin/checkout.c |  2 +-
 builtin/push.c     | 24 +++++++++++------------
 remote.c           |  8 +++++---
 remote.h           |  3 ++-
 t/t7508-status.sh  | 48 ++++++++++++++++++++++------------------------
 wt-status.c        |  3 ++-
 6 files changed, 45 insertions(+), 43 deletions(-)
Range-diff against v4:
1:  9626721c13 < -:  ---------- remote: advise about force-pushing as an alternative to reconciliation
-:  ---------- > 1:  e84989c4a6 wt-status: don't show divergence advice when committing
-:  ---------- > 2:  9bb643df7e remote: don't imply that integration is always required before pushing
2:  209e86588a ! 3:  5ff9ecb51b push: advise about force-pushing as an alternative to reconciliation
    @@ Metadata
     Author: Alex Henrie <alexhenrie24@gmail.com>
     
      ## Commit message ##
    -    push: advise about force-pushing as an alternative to reconciliation
    +    push: don't imply that integration is always required before pushing
     
    -    Also, don't put `git pull` in an awkward parenthetical, because
    -    `git pull` can always be used to reconcile branches and is the normal
    -    way to do so.
    +    In a narrow but common case, the user is the only author of a branch and
    +    doesn't mind overwriting the corresponding branch on the remote. This
    +    workflow is especially common on GitHub, GitLab, and Gerrit, which keep
    +    a permanent record of every version of a branch that is pushed while a
    +    pull request is open for that branch. On those platforms, force-pushing
    +    is encouraged and is analogous to emailing a new version of a patchset.
    +
    +    When giving advice about divergent branches, tell the user about
    +    `git pull`, but don't unconditionally instruct the user to do it. A less
    +    prescriptive message will help prevent users from thinking that they are
    +    required to create an integrated history instead of simply replacing the
    +    previous history. Also, don't put `git pull` in an awkward
    +    parenthetical, because `git pull` can always be used to reconcile
    +    branches and is the normal way to do so.
    +
    +    Due to the difficulty of knowing which command for force-pushing is best
    +    suited to the user's situation, no specific advice is given about
    +    force-pushing. Instead, the user is directed to the Git documentation to
    +    read about possible ways forward that do not involve integration.
     
         Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
     
    @@ builtin/push.c: static void setup_default_push_refspecs(int *flags, struct remot
      	N_("Updates were rejected because the tip of your current branch is behind\n"
     -	   "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' to delete the remote\n"
    -+	   "changes and replace them with your own.\n"
    ++	   "its remote counterpart. If you want to integrate the remote changes,\n"
    ++	   "use 'git pull' before pushing again.\n"
      	   "See the 'Note about fast-forwards' in 'git push --help' for details.");
      
      static const char message_advice_checkout_pull_push[] =
      	N_("Updates were rejected because a pushed branch tip is behind its remote\n"
     -	   "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 'git push --force' to delete\n"
    -+	   "the remote changes and replace them with your own.\n"
    ++	   "counterpart. If you want to integrate the remote changes, use 'git pull'\n"
    ++	   "before pushing again.\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
     -	   "(e.g., 'git pull ...') before pushing again.\n"
     +	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' to delete the remote changes\n"
    -+	   "and replace them with your own.\n"
    ++	   "the same ref. If you want to integrate the remote changes, use\n"
    ++	   "'git pull' before pushing again.\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[] =
     -	   "to integrate those changes locally (e.g., 'git pull ...')\n"
     -	   "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 'git push --force' to delete\n"
    -+	   "the remote changes and replace them with your own.\n");
    ++	   "been updated since the last checkout. If you want to integrate the\n"
    ++	   "remote changes, use 'git pull' before pushing again.\n"
    ++	   "See the 'Note about fast-forwards' in 'git push --help' for details.");
      
      static void advise_pull_before_push(void)
      {
-- 
2.41.0
Previous: Alex HenrieNext: Alex Henrie
Message 40 of 45 in “advise about force-pushing as an alternative to reconciliation”
  1. 0/2 advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 2, 2023
  2. 2/2 push: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 2, 2023
  3. 1/2 remote: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 2, 2023
  4. Phillip WoodJul 3, 2023
  5. Alex HenrieJul 3, 2023
  6. Junio C HamanoJul 4, 2023
  7. Alex HenrieJul 4, 2023
  8. Junio C HamanoJul 5, 2023
  9. Alex HenrieJul 6, 2023
  10. 0/2 advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 4, 2023
  11. 2/2 push: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 4, 2023
  12. 1/2 remote: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 4, 2023
  13. Junio C HamanoJul 4, 2023
  14. Alex HenrieJul 4, 2023
  15. 0/2 advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 6, 2023
  16. 1/2 remote: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 6, 2023
  17. Junio C HamanoJul 6, 2023
  18. Junio C HamanoJul 6, 2023
  19. Alex HenrieJul 6, 2023
  20. Junio C HamanoJul 7, 2023
  21. Junio C HamanoJul 7, 2023
  22. Alex HenrieJul 8, 2023
  23. Junio C HamanoJul 9, 2023
  24. Alex HenrieJul 10, 2023
  25. Junio C HamanoJul 11, 2023
  26. Alex HenrieJul 12, 2023
  27. Junio C HamanoJul 12, 2023
  28. Alex HenrieJul 13, 2023
  29. Phillip WoodJul 7, 2023
  30. 2/2 push: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 6, 2023
  31. Phillip WoodJul 7, 2023
  32. Junio C HamanoJul 7, 2023
  33. Alex HenrieJul 8, 2023
  34. Phillip WoodJul 11, 2023
  35. Alex HenrieJul 12, 2023
  36. Alex HenrieJul 12, 2023
  37. 0/2 advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 7, 2023
  38. 1/2 remote: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 7, 2023
  39. 2/2 push: advise about force-pushing as an alternative to reconciliationAlex Henrie, Jul 7, 2023
  40. 0/3 don't imply that integration is always required before pushingAlex Henrie, Jul 13, 2023
  41. 1/3 wt-status: don't show divergence advice when committingAlex Henrie, Jul 13, 2023
  42. 2/3 remote: don't imply that integration is always required before pushingAlex Henrie, Jul 13, 2023
  43. 3/3 push: don't imply that integration is always required before pushingAlex Henrie, Jul 13, 2023
  44. Phillip WoodJul 13, 2023
  45. Junio C HamanoJul 13, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.