Git:本地跟踪,添加新分支?

5

我正在努力整理我的git仓库:

  1. 创建一个新分支来镜像我的生产(master)分支。
  2. 删除任何不必要的分支,无论是本地还是远程的。
  3. 将我的本地分支设为本地跟踪分支(我不确定是否需要这样做,会有什么好处?)
  4. 为每个工作流阶段设置一个分支,例如一个用于本地和开发(dev)的分支、一个用于预发布(staging)的分支和一个用于生产(production)的分支。本地和开发可以共用一个工作分支,但预发布和生产需要单独设置分支。

您可以从命令行中查看我的环境。

$ git remote
dev
origin
production
staging

$ git branch -r
dev/dev
origin/HEAD -> origin/master
origin/dev
origin/master
production/master
wpengine-findcra/master

$ git branch -vv
dev                   xxxxxxx <comment>
*master               xxxxxxx [origin/master] <comment>
production/staging    xxxxxxx [remotes/production/master] <comment>
staging/master        xxxxxxx <comment>

我有4个工作地点。代码从1流到4。
  1. 我的本地机器
  2. 开发服务器
  3. 预发布服务器
  4. 生产服务器
我想为预发布服务器添加一个新的分支,现在我想将其镜像到生产(主)分支。但我遇到了这个错误,不知道该怎么办。
$ git checkout master
$ git branch staging
error: there are still refs under 'refs/heads/staging'
fatal: Failed to lock ref for update: Is a directory

我的代码已更新至 origin/master 和 dev/dev 分支。


这个回答有点道理,但原问题涉及“推送”,我不知道如何将其应用到我的情况中。https://dev59.com/KWXWa4cB1Zd3GeqPNoRo?answertab=active#tab-top - italiansoda
1个回答

12
如果你的分支名称包含斜杠,Git会在.git/refs/heads目录中创建一个以分支名称中斜杠前部分命名的目录,并在其中放置该分支本身的引用。因此,目录.git/refs/heads/staging/存在,并包含一个名为"master"的文件,这是由于你的分支名为staging/master。
当你尝试创建名为"staging"的分支时,Git会尝试创建.git/refs/heads/staging文件。由于该文件已经存在但是是一个目录,所以操作将失败。因此,你不能在仓库中拥有这些名称的两个分支。
在较新版本的Git中,错误信息将如下所示:
fatal: cannot lock ref 'refs/heads/staging': 'refs/heads/staging/master' exists; cannot create 'refs/heads/staging'

谢谢,这指引我朝着正确的方向前进!最终我删除了本地分支staging/master,并创建了一个新的远程链接到我的staging服务器的分支staging/staging。我还将其推送到我的origin服务器上的origin/staging(也称为github)。我删除了staging/master,但由于我处于相同的代码库中,因此能够检出origin/master并将其分支到新的staging/staging中。 - italiansoda

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