如何在GitHub上合并远程更改?

136

当我尝试进行第一次 Github 推送时,我遇到了以下错误:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

我该如何修复这个问题并合并远程更改?

7个回答

108

有关详细信息,请参见“git push --help”中的“不快进(non-fast forward)”部分。

您可以执行“git pull”,解决潜在的冲突,然后“git push”结果。 "git pull"将在提交A和B之间创建合并提交C。

或者,您可以使用“git pull --rebase”在A顶部将X和B之间的更改变基,然后将结果推回。 变基将创建一个新的提交D,该提交将X和B之间的更改构建在A的顶部。


16
我一直遇到这个问题,但如果我执行“git pull”,会提示“已经是最新版本”,如果我执行“git pull --rebase”,则会提示“当前分支主干已经是最新版”。有什么想法吗?谢谢! - jwl
3
@larson4 我也遇到了同样的问题,但是在你执行 git pull 之后,再进行一次提交,然后就应该没问题了。 - Patrick
20
@Patrick @larson,我曾经遇到过类似的问题,这是因为我没有仔细阅读错误信息所致。拒绝操作是在我没有检出的一个分支上发生的。而我实际工作的分支是正常的。解决方案是执行git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on - Noah Spurrier

88

你也可以在分支名字前加上 + 符号来强制推送。

git push origin +some_branch

1
谢谢,这个对我有用。其他解决方案会完全抵消我的 git reset --hard 的效果。 - Oli
1
谢谢!我已将分支"A"推送到Heroku的staging应用程序中,以在生产环境中测试某些功能。然后(本地)我将“A”和“B”合并到了“master”中,并想要将“master”推送到我的staging应用程序中。一度遇到了各种问题。这使得推送“master”变得非常简单。谢谢! - Don Leatham
对我也起作用了。花了我4个小时才找到问题所在。非常感谢。我在本地机器上运行Netbeans(Windows 7),并希望在每次本地推送时,在远程机器上进行检查。 - Maxim Shoustin
请注意,这种方法可能不安全,并且可能导致一些分叉提交无法访问。 - samuil
这应该是被接受的解决方案。其他的解决方案对我来说都不起作用。 - banarun
我同意,这是更好的解决方案。上面的评论线程只是重新提交文件,仍然显示相同的错误。 - thinker

20

你可能在 Github 上有尚未合并的更改。请尝试运行 git pull 命令,以获取并合并这些更改,然后再进行推送操作。如果我误解了你的问题,请谅解。


18
如果你需要拒绝远程主分支的更改并推送你自己的更改,请尝试使用"-f"键进行推送。 - Hotsyk

13

如果你执行了 "git pull" 命令,但是显示 "Already up-to-date.",并且仍然出现此错误,可能是因为你的其他分支没有更新到最新版本。尝试切换到另一个分支,并确保该分支也已经更新到最新版本,然后再次尝试执行 "git push" 命令:

切换到 "foo" 分支并更新它:

$ git checkout foo
$ git pull

你可以通过执行以下命令查看你拥有的分支:

$ git branch

你能解释一下为什么这样做是必要的吗?(它确实解决了我的问题。)对我来说,这似乎有些违反直觉。我不明白为什么git需要另一个分支也保持最新状态,我才能在主分支上推送。 - Quinxy von Besiex
@QuinxyvonBesiex 我自己也不太确定理解了。这可能与 Git 本身的基础结构有关,以及它如何组织分支(在我理解中基本上与标签相同)。 - David Calhoun

7

你可以强制执行它,但请仅在确信自己知道自己在做什么时才这样做。

命令如下:

git push -f 

3

当您有冲突的标签时,也会出现此问题。如果您的本地版本和远程版本使用相同的标签名称来表示不同的提交,则可能会遇到这种情况。

您可以通过删除本地标签来解决它:

$ git tag --delete foo_tag

2

当我遇到这个错误时,我备份了整个项目文件夹。然后我做了类似以下操作:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

根据您的分支名称(如果不是主分支),操作方法有所不同。

然后我执行了 git pull --rebase 命令。之后,我用备份的项目文件替换了拉取下来的文件。现在我已经准备好再次提交我的更改并推送了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接