当我试图将我的代码推送到GitHub时,我遇到了一些问题。

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

我还没有在存储库中推入任何东西,那么为什么我需要拉出一些东西呢?


当前回答

正如这条信息告诉你的,

合并远程更改(例如:git拉)

使用git pull将最新的更改从远程存储库拉到本地存储库。在这种情况下,提取更改将需要合并,因为您已经对本地存储库进行了更改。

我将提供一个例子和一张图片来解释。让我们假设你最后一次从原点/分支抽取是在提交b。你已经完成并提交了一些工作(提交C)。与此同时,其他人已经完成了他们的工作,并将其推到原点/分支(提交D)。这两个分支之间将需要合并。

——提交C / / / origin/branch:提交A ------提交B ----提交D

因为您是想要推送的人,Git会强制您执行合并。为此,您必须首先从原点/分支获取更改。

本地分支:——提交C——提交E / / / / / / origin/branch:提交A ------提交B ----提交D

在完成合并之后,您现在可以通过推送您的更改将原点/分支快进到Commit E。

Git要求您自己处理合并,因为合并可能会导致冲突。

其他回答

这可能导致远程存储库丢失提交;小心使用。

如果你不希望将远程分支合并到本地分支(参见git diff的区别),并且想要强制推送,请使用push命令和-f

git push -f origin <branch>

原点是远程回购的名称。

通常,该命令拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。这个标志禁用检查。这可能导致远程存储库丢失提交;小心使用。

git pull origin branch_name --rebase

这对我来说是可行的——命令git pull origin branch_name——rebase将首先从远程branch_name中提取更改,然后在其顶部重新设置当前分支。

您的分支名称是否与远程分支名称相同?

如果没有,您应该签出一个与远程分支同名的新分支,并尝试再次推送它。

假设要推送的远程分支是[testing],本地分支名为[test]。

如果你不在测试分支,首先切换到它。

git checkout test

然后打开一个新的分支并命名为testing。

git checkout -b testing

现在,是时候推它了:

git push [remote repo] testing

当我试图推我当前的分支foobar时,我得到了上面提到的错误消息:

git checkout foobar
git push origin foo

结果是我有两个本地分支跟踪同一个远程分支:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

它为我工作,通过使用我的当前分支:

git push origin foobar:foo

... 并使用git分支-d进行清理

另一种选择:在本地将分支重命名为新的名称。

然后,您将能够将其推送到远程存储库,例如,如果这是您保持副本(备份)并确保没有丢失任何东西的方法。

您可以获取远程分支以获得本地副本,并检查(i)远程所拥有的(使用旧的分支名称)和(ii)您所拥有的(使用新分支名称)之间的差异,并决定要做什么。由于您一开始就没有意识到远程的差异(因此出现了问题),因此简单地合并或强制在某个地方进行更改就太残酷了。

查看差异,选择您想要处理的分支,从其他分支中选择您想要的更改,或者恢复您不想要的分支上的更改,等等。

然后,您应该能够决定是否要将干净的版本强制到远程服务器上,或者添加新的更改,或者其他什么。