我正在使用Linonde来托管我的git repos以及实际的站点文件。
git branch -r看起来像这样:
company/master
company/stage
origin/HEAD -> origin/master
origin/master
prod/master
git branch看起来像这样:
master
stage
我想我只想让我的本地舞台分支指向我的公司/主人。当我做git push company stage
它似乎更新我在服务器上的舞台头,但我试图让它更新主头,这是我的网站似乎从它的文件服务。或者我需要弄清楚如何将我的网站指向公司/舞台头。
我尝试删除我的分支并使用
创建分支git branch stage company/master
因为我认为起点可能就是我所需要的。
当我尝试推送之后,我收到消息:
error: failed to push some refs to 'root@foo:~repos/project_name'
To Prevent you from losing history, non-fasst-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.)
我尝试了git pull
,但它说一切都是最新的,我在快进的帮助文档中找不到任何解决我情况的内容。
答案 0 :(得分:6)
首先,值得解释当你这样做时会发生什么:
git push company stage
最后一个参数是一个真正的refspec,它定义了源ref和目标ref之间的映射 - 在你可能正在处理的简单情况下,这些“refs”是分支名称。如果refspec中没有:
,那么假设您要推送到同名的分支。因此,您运行的命令等同于:
git push company stage:stage
相反,如果您要更新master
存储库中的company
分支,则需要执行以下操作:
git push company stage:master
继续,删除分支并使用以下命令重新创建分支:
git branch stage company/master
...在您的git配置中创建条目,将您的本地分支stage
与存储库master
中的分支company
相关联。 ¹这意味着,如果您在分支stage
上,运行git pull
应该做正确的事情,在这种情况下,将更新远程跟踪分支company/master
,并合并进入stage
。
不幸的是(并且令人困惑)这些配置选项不会(默认情况下)影响git push
的行为,我wrote about in some detail elsewhere。您没有提到之后使用的git push
命令的形式,但您应该这样做:
git push company stage:master
...如果您想使用本地master
分支更新company
存储库中的stage
分支。 (如果您只是尝试git push company
,那么将尝试在本地存储库和company
之间推送每个“匹配”分支,其中“匹配”表示“本地和远程存在同名分支”。您可以通过将push.default
配置选项设置为tracking
来更改此行为。)
¹在早期版本的git中,您必须添加--track
参数,但有一段时间是起始点是远程跟踪分支的默认值。