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


137

我遇到以下错误,尝试先进行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.

如何解决此问题并合并远程更改?

Answers:


106

有关详细信息,请参见git push --help的“非快进”部分。

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

或者,您可以使用“ git pull --rebase”在A之上的X和B之间重新设置更改,并将结果推回去。重新设置基准将创建一个新的提交D,该提交将在A的顶部建立X和B之间的更改。


16
我一直遇到这个问题,除了如果我进行“ git pull”操作时,会被告知“已经是最新的”。如果我执行“ git pull --rebase”,则会被告知“当前分支主机是最新的”。有任何想法吗?谢谢!
jwl 2011年

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 2012年

86

您还可以通过在分支名称之前添加+符号来强制执行推送。

git push origin +some_branch

1
谢谢,这个对我有用。其他解决方案将完全消除我的影响git reset --hard
Oli 2012年

1
谢谢!我已经将分支“ A”推送到我的Heroku登台应用程序中,以测试生产环境中的某些功能。然后(在本地)我将“ A”和“ B”合并为“ master”,并希望将“ master”推送到我的暂存应用程序中。有各种各样的问题。这使得推动“主人”非常简单。谢谢!
唐·里特姆

也为我工作。花了我4个小时才找到问题。非常感谢。我在本地计算机(Windows 7)上运行Netbeans,并希望在每次本地推送时都在远程计算机(linux)上签出。
Maxim Shoustin 2012年

请注意,此方法可能并不安全,并且可能导致某些分散的提交无法访问。
samuil

这应该是公认的解决方案。其他解决方案对我
不起作用

20

您可能在github上进行了从未合并的更改。尝试git pull获取并合并更改,那么您应该可以推送。对不起,如果我误解了你的问题。


18
如果您需要拒绝远程主服务器中的更改并推送您自己的更改,请尝试使用-f键进行推送
Hotsyk

13

如果您“ git pull”并且说“已经是最新的。”,但仍然出现此错误,则可能是因为您的其他分支之一不是最新的。尝试切换到另一个分支,并在再次尝试“ git push”之前确保该分支也是最新的:

切换到分支“ foo”并对其进行更新:

$ git checkout foo
$ git pull

您可以通过发出命令来查看已获得的分支:

$ git branch

您能解释一下为什么这样做是必要的吗?(它确实解决了我的问题。)对我来说,这似乎违反直觉。我不明白为什么git还需要另一个分支来更新我才能推送到master分支。
Quinxy von Besiex

@QuinxyvonBesiex我不确定我自己是否理解。它可能与Git本身的底层结构以及它如何组织分支有关(据我所知,它基本上与标签相同)。
David Calhoun 2015年

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。之后,我用备份项目的文件替换了拉出的文件。现在,我准备再次提交更改并推送。


0

1)强制拉动以覆盖本地更改

如果您不关心本地所做的更改,并且想从存储库中获取代码,则可以强制执行拉取。这将覆盖您在计算机上所做的所有本地更改,系统将在存储库中显示该版本的重复副本。

在您的IDE中执行以下命令:

git reset-困难

git pull

这将立即破坏您的所有本地更改,因此请确保您知道自己在做什么并且不需要本地更改。

2)保持两个变化(本地和来自仓库)

如果要保留这两个更改(本地更改和存储库中存在的更改),则可以添加并提交更改。拉动时,显然会有合并冲突。在这里,您可以使用IDE中的工具(例如Difftool和mergetool)比较两段代码,并确定保留哪些更改和删除哪些更改。这是中间的方法;除非您手动将其删除,否则所有更改都不会丢失。

git添加$ the_file_under_error

git提交

git pull
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.