在本地和服务器上处理多个Git Head

时间:2011-08-21 16:37:17

标签: git branch head linode

我正在使用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,但它说一切都是最新的,我在快进的帮助文档中找不到任何解决我情况的内容。

1 个答案:

答案 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参数,但有一段时间是起始点是远程跟踪分支的默认值。