创建分支别名?

51

我正在研究从Starteam迁移到Git。

目前,在Starteam中,我们使用带有特殊名称的“浮动视图(floating views)”。这些浮动视图基本上像别名一样工作。因此,我们可以指定要从其中签出的特定别名,并获得我们当前模型测试的分支。

在Git中,如何实现这一点?基本上,这就是我们的分支如何组织的:

这些都是分支

master (stable view)
   |  - Branch 2012.05.01
   |          | - Project 1
   |          | - Project 2
   |          | - model [floating view / alias to Branch 2012.05.01]
   |
   |  - Branch 2012.07.11   (these would also have various child views for projects)
   |  - Branch 2012.10.17

当模型测试完成后,Branch 2012.05.01 将被合并到 master 分支中。

在我们的自动化脚本(ant)中,为了运行我们的模型部署,我们只需从名为 model 的分支中检出即可。这样,我们更改正在测试的模型所使用的分支时,就不必更改脚本,并且找出我们正在测试的视图就像弄清楚 model 分支引用哪个分支一样简单。

是否有类似于 Git 的方法可以实现这样的功能?

明确一下:

  1. 我想要一个分支的别名。一个分支,而不是提交。
  2. Branch 2012.05.01 意味着打算在 2012.05.01 发布的分支,它并不表示时间中的 2012.05.01 时刻。
  3. 我想给 Branch 2012.05.01 设置一个别名。 Branch 2012.05.01 是一个集成分支,它经常被修改。但我不想将其引用作为 Branch 2012.05.01,我希望将其引用作为 model。这样,我可以更改我的别名以引用 Branch 2012.07.11,而无需更改任何检出代码脚本即可获取该分支的最新代码。

如果这是一个集成分支,那么我提供的链接中的工作流程对您应该有用。添加一个发布候选分支也会很有帮助。您可以在那里跟踪已完成的任务或功能。您可以使用它来部署到测试或暂存环境。 - Adam Dymitruk
2
据我所知,Git 没有这样的功能,但你可以简单地将你的“最年轻”的分支命名为“model”,然后从它进行发布分支的创建。 - miniBill
@AdamDymitruk,这个链接确实有帮助。基本上这就是我们在Starteam中所做的事情,但它并没有回答我的问题,即如何创建一个分支的别名。 - user606723
1
此处所述,您可以通过符号引用创建别名。 - g_daniel
感谢 @g_daniel。我不确定正确的修复方法,但我已投票关闭此问题。 - user606723
git symbolic-ref refs/heads/master refs/heads/main -- 如果你的代码库使用的是 main 分支而你习惯于老派的 master 分支 :) - kolypto
3个回答

70

请参见此处:https://dev59.com/53RB5IYBdhLWcg3wr48V#549949

你可以像Greg建议的那样将主分支重命名为trunk,或者创建一个符号引用作为主分支的trunk,以便git和svn用户都有他们习惯的“main”分支。

git symbolic-ref refs/heads/trunk refs/heads/master

请注意,trunk不是一等公民。如果你检出trunk并执行git status命令,实际上你会在master分支上,但你可以在所有使用分支名称的地方使用trunk命令(如log、merge等)。


10
对于像我一样遇到困难的人,我想提醒一点——在“refs”和“heads”中要非常注意单数和复数。如果你漏掉了任何一个“s”,你会得到完全不同的结果。 - Sridhar Sarnobat
9
在参数顺序方面一定要非常小心。它与 ln -s 不同,如果你把它们放错位置,git 将会快乐地(而且悄无声息地)用一个指向不存在的符号引用来覆盖真实分支的 HEAD 引用(此时,你最好希望能够轻松地恢复该分支的正确提交哈希值)。 - phils
10
不要尝试使用 git branch -d 移除符号引用。即使进行此操作,它也会被取消引用,因此您实际上将删除源分支,但保留引用(如果您当前已检出该分支,则甚至会允许您这样做)。似乎唯一删除符号引用的'接口'是删除文件。 - phils
4
phils 写道:“(在这一点上,你最好希望能够轻松恢复该分支的正确提交哈希)。” 恢复提交哈希始终很容易:git reflog - Nathan Kidd
4
貌似唯一删除符号引用的“接口”就是删除文件。git symbolic-ref -d refs/heads/trunk 也可以正常工作。 - iCodeSometime
显示剩余2条评论

6

Git不支持分支别名。

这意味着您将不得不依靠脚本中的变量来创建model="branch.2012.10.17"或类似的内容。然后,您的脚本将执行以下操作:

git checkout $model

我将这个答案的剩余部分留在这里,以便我们在讨论中了解:

关于分支策略的详细讨论可以在这里找到: http://dymitruk.com/blog/2012/02/05/branch-per-feature/

具体来说,请查看集成分支和发布候选分支的作用。这可能是你要寻找的。

将Git视为对您的工作目录进行快照的东西,而不是文件夹的历史记录。

progit.org/book 解释了存储历史记录的有向无环图。所有引用都只是指向其中节点的东西。这应该澄清您希望构建工作流程的方式。

创建一个起始标签- version2.1。从那里开始制作int-version2.1(出于简洁起见,使用nubmers代替日期)。您开始的任何工作都要从版本2.1标记开始。将工作合并到int-version2.1中。其他人也会这样做。


3
Git不支持引用另一个引用。所有引用都会解析到一个提交。 - Adam Dymitruk
我想我必须找到一个创造性的解决方案。谢谢 :) - user606723

0

如果你需要按功能分支 — Adam Dymitruk的回答是正确的, 但是如果你需要保存链接分支 - 特定状态(基于时间),而不改变它们,你可以使用git标签。

我用标签来存储每个生产发布的状态。


我根本不需要保存特定的状态。我只想通过将其称为“模型”而不是“分支2012.05.01”来从分支2012.05.01检出,以便我的脚本不需要更改。 - user606723
git checkout <hash/tag/brachname> 对于分支和标签的操作是相同的。 - iMysak

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