On Mon, Nov 15, 2021 at 12:42 AM Erwin Villejo <erwinvillejo@xxxxxxxxx> wrote: > > > What did you do before the bug happened? (Steps to reproduce your issue) > * make local changes, stage, and commit > * local is ahead of upstream. confirmed by `git status`: > > ``` > $ git status > On branch main > Your branch is ahead of 'github/main' by 1 commit. > (use "git push" to publish your local commits) > ``` > > * try to pull upstream to local > > > What did you expect to happen? (Expected behavior) > No-op (and NO failure) since local is ahead of upstream. > > > What happened instead? (Actual behavior) > `git pull` fails with error: > > ``` > $ git pull > hint: You have divergent branches and need to specify how to reconcile them. > hint: You can do so by running one of the following commands sometime before > hint: your next pull: > hint: > hint: git config pull.rebase false # merge (the default strategy) > hint: git config pull.rebase true # rebase > hint: git config pull.ff only # fast-forward only > hint: > hint: You can replace "git config" with "git config --global" to set a default > hint: preference for all repositories. You can also pass --rebase, --no-rebase, > hint: or --ff-only on the command line to override the configured default per > hint: invocation. > fatal: Need to specify how to reconcile divergent branches. > ``` > > > What's different between what you expected and what actually happened? > I expected no failure and no-op since local is ahead of upstream. > Instead, `git pull` > fails because it thinks the branches have diverged. You're making a logical, but still incorrect, assumption about what the "git status" output means. "git status" does NOT actually check the remote server. When you pull, there are typically 3 refs that are involved, not 2. (Given it appears you're on "main", I'll use that name below.) refs/heads/main: This is the local branch you're working on refs/remotes/github/main: This is your _local copy_ of what the _remote_ branch was pointed at the last time you fetched or pulled successfully refs/heads/main on Github: This is the remote branch you're trying to push to When you run "git status", it is NOT talking to Github; it's simply comparing the state of your "refs/heads/main" and "refs/remotes/github/main" branches. When you run "git pull", it's actually talking to Github, which allows it to find out about commits that are present remotely but have not been fetched to your "refs/heads/main" or "refs/remotes/github/main" branches. If you run "git fetch", rather than "git pull", that will update your local "refs/remotes/github/main" branch without trying to also update "refs/heads/main". If you then run "git status", it will tell you your "main" branch has diverged, just like "git pull" does, instead of showing it as ahead. Hope this helps, Bryan > > > Anything else you want to add: > I found this bug in VSCode. VSCode runs `git pull` first before `git > push` when pushing to upstream. > This bug causes pushing via VSCode to always fail, although it can be > worked around by simply opening > a terminal and running `git push` manually. > > [System Info] > git version: > git version 2.33.1 > cpu: x86_64 > no commit associated with this build > sizeof-long: 8 > sizeof-size_t: 8 > shell-path: /bin/sh > uname: Linux 5.15.2-arch1-1 #1 SMP PREEMPT Fri, 12 Nov 2021 19:22:10 > +0000 x86_64 > compiler info: gnuc: 11.1 > libc info: glibc: 2.33 > $SHELL (typically, interactive shell): /bin/bash > > > [Enabled Hooks] > > Best regards, > Erwin