在Heroku推送代码时出现Git错误

16
我正在使用Heroku,拥有一个稳定的Rails应用程序(生产环境),因此我想创建一个新的环境进行质量保证,在这个环境中,我可以看到如何在Heroku上工作的更改(以及聚合版本发布的增强功能),而不总是将其推送到生产应用程序中。
所以我创建了一个新的Heroku应用程序,并在本地创建了一个新的分支(dev)。我的意图是在我测试过新的Heroku QA应用程序上的更改后,将dev合并到本地的master中,然后从我的主分支推送到Heroku生产。
我的做法可能在我的情况下不太好,因为我是一个新手,所以这只是我最好的猜测。
但是当我将dev分支推送到我的新QA应用程序时,它可以用于将更改推送到QA应用程序的dev分支,但不能用于推送到master。所以我无法在新的QA应用程序上看到(和测试)我的更改。它似乎告诉我,我只能将主分支推送到我的QA应用程序的主分支,因为我已经拉取并且一切都已经更新,但我收到了这个错误:
Pushing to git@github.com:foobar/QA.git
To git@github.com:foobar/QA.git
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:foobar/QA.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的问题?谢谢。


你在询问Heroku,但是你的错误信息显示Github。请确保你正在推送到正确的地方。 - matt
3个回答

42
尝试使用-ff(快进)选项进行推送:git push heroku master -ff(将heroku替换为实际的heroku远程名称)。

2
似乎必须有更好的方法。由于多个开发人员正在应用程序上工作,如果有比快进更好的设置或其他方法,我认为那将是更好的选择。 - yellowreign
这对我有用。我有点困惑为什么会发生这种情况,因为我只是像平常一样在本地合并了一个分支并推送到GitHub,然后再推送到Heroku。看起来很奇怪。 - stevec
我找到了问题出在哪里。我在推送到Heroku之后运行了 git commit --amend,这实际上更改了提交的SHA(我不知道它会这样做),因此Git认为Heroku超前了。在我这种情况下,直接运行 git push --force heroku master 是可以的(因为我确信Heroku上的区别仅限于提交消息而已)。 - stevec

29

Heroku应用程序只能从应用程序仓库(master)运行(本地 Heroku)。如果您想要将不是本地 repo 的 master 分支的分支部署到 Heroku,则需要指定它。在您的情况下,应该像这样: git push qa-remote dev:master (将 qa-remote 替换为 QA 应用程序的实际远程名称),它表示将我的本地dev分支推送到qa-remote上的master分支。

当您首次进行这样的推送时,您可能需要添加-f标志来强制推送(非快进方式)。之后,只要您的本地分支是最新的,就应该能够在没有-f标志的情况下进行推送。


2
使用以下命令强制推送更新:git push -f heroku master。原始答案翻译成中文为"最初的回答"。

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