GitHub 更新被拒绝,因为当前分支的尖端落后于它的远程分支

GitHub updates were rejected because the tip of current branch is behind its remote counterpart

我想我已经掌握了 GitHub 的基础知识 - 我了解在我的本地机器上初始化存储库、提交、推送、拉取、克隆等。但是当涉及到分支等时,我完全丢失。

现在我正在尝试推送我的最新版本的项目,但我做不到。以下为真:

  1. 网站上的存储库是我的,我是这个项目的唯一合作者;

  2. 这个网站是我的作品集。我只创建过 master 分支,但有一个 "developing" 分支不是我创建的,但我假设这是在 GitHub 页面上创建投资组合时的默认分支。

  3. 这个项目之前推过好几次了,一直都是问题

正如我所说,我正在尝试推送我的最新版本。这是发生了什么:

我查看了我所在的分支,它说我在 "master"。我添加、提交并尝试通过我的终端推送。它询问我的用户名和密码,我将它们输入,然后 returns:

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/...(my portfolio      address)...io.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

然后我尝试拉,并收到了这个:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

   git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

  git branch --set-upstream-to=origin/<branch> master

我不明白这个。在分支机构后面到底意味着什么?我以为我明白这一点,但显然我不明白。而且就算拿到了,自己的支线又怎么会落后于自己呢?我从来没有推到任何其他分支!

根据评论,听起来你把这里弄得一团糟,你将不得不以某种方式清理。不过,解决眼前问题的方法:

There is no tracking information for the current branch.

是 Git 告诉你做的:

git branch --set-upstream-to=origin/<branch> master

特别是,您显然希望将 origin/master 设置为 master 的上游:

git branch --set-upstream-to=origin/master master

现在所有三个命令——git pull1 git mergegit rebase——都会知道你想保留你的 master 与您 Git 对其他 Git 的 master.

的记忆同步

你的 Git 在某些点(当你告诉它时)连接到 origin,找出 他们他们的主人,把需要的东西都带来,并让你的origin/master记住这一点。主要联系人是你 运行ning git fetchgit fetch origin(如果你省略了 origin,Git 确定你要使用哪个遥控器,或者猜测 origin 如果所有其他方法都失败了)。

更新记忆后,您可以将自己的记忆(您的 master)与您的 Git 记得他们的记忆(您的 origin/master)进行比较。如果是时候这样做,您可以 git mergegit rebase 您的主人,使用他们的(您的记忆)合并或变基。

您可能会遇到合并冲突!这些都是正常的:它们只是意味着 改变了一些文件,他们(不管他们是谁)改变了 相同 文件,并且你们都触摸了该文件的相同 ,但是你和他们对 做了不同的事情线。 Git 不知道是你比他们聪明,还是他们比你聪明,还是怎样。它只是将 both 更改放入您的文件并让您清理混乱。您现在必须编辑冲突文件,将 right 行放入其中,并将它们保存回工作树;然后git addgit commit所有合并的最终结果。

(如果你使用 git rebase 而不是 git merge,你仍然会遇到合并冲突,但是一旦你解决了它们并 git add-ed 文件,你应该 运行 git rebase --continue 而不是 git commit。请参阅有关合并和变基的许多其他 SO 问题和答案。)


我建议避免使用 git pull,因为它做的太多了:它首先为您 运行s git fetch,然后为您 运行s git merge。 (或者它 运行 对你 git rebase 而不是 git merge,如果你这么说的话。)现在,在 git fetch 之后,你经常想要 运行 这两个命令之一...但您不一定要 运行 它 马上 。而且,您有 两个 命令可以尝试:您怎么知道您想要哪一个? 如果事情出错了——他们确实出错了——你怎么知道要寻找哪个命令的帮助?如果 you 运行 merge or rebase yourself,你就有了所有这些的答案。这就是为什么我说:忘掉 git pull,坚持使用 git fetch 和你喜欢的任何其他第二个命令。