什么是修补程序的正确方法?

时间:2015-01-27 11:38:56

标签: git

我在BitBucket.org上有我的项目的Central(远程,原始)回购。
在我的服务器上克隆Live repo
在我的机器上克隆了Dev repo

我在dev repo上做开发。并且已经将许多提交推向了Central repo。但实时回购在克隆/启动时处于同一状态。

在最终完成所有开发工作之前,我不想在Live服务器上执行git pull

但是......我在代码中发现了一个错误;我必须立即修复Live网站。所以我去了live server(这是几个中心后面的提交)并对代码进行了更改。然后我上传了那个单独的文件并提交了它。

现在,当我尝试将此提交推送到Central repo时(我可以继续使用Dev repo),我得到以下内容:

# git push -u origin master
Password: 
To https://xxx@bitbucket.org/xxx/xxx.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://xxx@bitbucket.org/xxx/xxx.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

我知道有关快进的问题。但是,我认为我做错了。我怎样才能正确处理这种情况?我现在如何才能正确恢复?

3 个答案:

答案 0 :(得分:3)

问题是,实时服务器上的master分支和中央仓库中的master分支已经分歧。

如果您不想在实时服务器上执行git pull(和/或rebase),因为这会带来其他不必要的更改,那么恢复的最佳方法是在实时服务器上创建一个修补程序分支,其中包含您的修复,然后推送:

git checkout -b hotfix-20150127 master
git push origin hotfix-20150127

然后,您可以在您的开发机器上获取该分支,并将其合并到master中,并使用最新的开发版本进行测试。然后,当您最终将实时服务器更新为最新代码时,您知道修复程序仍然存在。

您还应该重置直播服务器上的master,以使其master再次成为origin/master的祖先:

git branch -f master master^

这会强制git将master分支的头部更改为先前的提交(在实时服务器上进行修复之前)。您不会丢失提交,因为它仍然在hotfix-20150127分支(当前已检出)。

将来要避免这种情况的方法是在开始进行任何更改之前创建修补程序分支(因此master分支永远不会发散)或者在dev上创建修补程序分支machine(从与实时服务器相同的版本分支)并在那里进行测试,然后将其推送到实时服务器并在实时服务器上进行检查。

基本上,解决方案是从在实时服务器上运行的稳定版本创建分支,并对该分支应用基本修复,并确保来自该分支的所有修复都合并回主开发分支。在两个独立的分支上工作允许您对稳定版本进行高优先级修复,而不会干扰unstable分支上的开发。请参阅Git Flow了解更复杂但更灵活的方法。

答案 1 :(得分:2)

在这种情况下,我会在实时版本上创建一个新分支,将修复程序添加到新分支,然后将新分支推送到中央仓库。这样你就可以将master和新的bugfix分支拉到你的dev机器上并处理那里的合并冲突。

git checkout -b bugfix
git add <fix-files>
git commit
git push origin bugfix

将来可能值得将实时版本保留在自己的分支上。这样您就可以准确控制正在运行的内容。如果您需要进一步修复,可以在中央仓库(在发布分支上)进行修改,然后将它们拉到实时服务器上。

要从此处恢复使用

git checkout -b bugfix

创建新分支,然后如Jonathon所说,使用

git branch -f master master^

将master重置为与中央仓库同步

(感谢Jonathon简化它)

答案 2 :(得分:-1)

git push origin master
To https://github.com/Joey-project/project.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/Joey-project/project.git'

经常是一个重新出现的错误。

我读过这可能是因为不应该将他/她的分支推送到更新的远程分支。

这个想法是使用类似的东西:

git fetch origin; git merge origin/master

也许这个链接可以提供帮助:git rejected push non-fast-forward。这似乎是相关的。

我希望它有用,我建议你检查一下;)

乔伊