Re: git pull bug report

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux