将主分支设置为最新标签

6

这是我的git仓库目前的示例:

v1.0    v1.1    v1.2
  |       |       |
  a   -   b   -   c
  |               |
master           HEAD

我通常会这样提交、打标签并推送标签:

git commit -a -m "Commit msg"
git tag -a v1.3 -m "Tag msg"
git push --tags

我遇到的主要问题是master分支不会移动到最新的标签,因此我总是处于分离的HEAD状态。有没有办法解决这个问题,让master分支始终指向最新推送的标签?


2
你的工作流程是什么?为什么你总是处于分离 HEAD 状态?为什么不在一个分支上工作?我认为这更多是你工作流程的问题,而不是其他任何事情。 - John Szakmeister
1
如果您不直接检出标签,这种情况就不会发生。只有在检出分支后才进行新的提交,而不是标签 - cdhowie
为了能够在仓库中生成软件包文件,我需要对它们进行标记,否则它们会变成类似于“a3fsr2”的名称,这就是为什么我需要使用标签的原因。 - Peter
5个回答

9
在这个特定的情况下,我需要执行以下操作:
  1. 首先将主分支设置为指向最新的标签(HEAD所指向的标签),因为它是最近的标签。为此,我创建了一个新分支并将主分支合并到它。
git branch -b exp
git merge -s ours master
git checkout master
git merge exp

现在的 master 分支与最新的标签相同:
v1.0    v1.1    v1.2
  |       |       |
  a   -   b   -   c
                  |
                 HEAD
                  |
                master

一旦我们恢复了主分支,每当我们进行新的提交时,我们需要同时推送主分支和标签:
git commit -a -m "Commit msg"
git tag -a v1.4 -m "Tag msg"
git push master --tags

这样我们可以避免进入分离头状态,并更新主分支。


有趣的反馈,比我的回答更完整。+1 - VonC
3
git checkout -B master HEAD 相当于直接执行了您的第一步。 - jthill

4

已经有很多答案/评论解释为什么不要以这种方式操作,但是以下是如何解决这个特定的场景:

git checkout -b tmpbranch       # creates a branch called tmpbranch at HEAD
git checkout master             # switch back to master branch
git merge --ff-only tmpbranch   # fast-forward merge master to tmpbranch, fail if not possible
git branch -d tmpbranch         # delete tmpbranch, it's not needed anymore

然后,以后再也不要检查标签,除非按照以下方式进行:
git checkout -b somebranch refs/tags/tagname    # creates a new branch starting at tag

这样,您就不会处于分离的HEAD状态,并且任何新提交将从所讨论的标签开始添加,这似乎是您想要的... 在进行提交后,您可以使用git tag newtag在正确的位置创建其他标签。


这个解决方案的问题在于,我将为仓库中每个标签都需要创建一个分支。 - Peter
1
@Peter 只有当你的标签都在不同的开发行上时,才会出现这种情况,但从你最初的问题中看来并非如此。你将拥有一个分支,比如 master,其中一个标签 v2.0 指向该分支上最近的提交,而早期的标签(例如 v1.9v1.8...)则指向该分支上较早的提交。分支应该指向“我下一次提交的父级是什么”。上述的 checkout 命令是为了在准备修复错误或其他事情时检出旧的标签,而不是用于当前的开发... - twalberg

3
一个分支不引用标签。
一个标签引用一个固定的提交。
因此,只要你执行 git checkout master 命令,你就不处于分离的 HEAD 模式
然后,您可以提交和打标签:标签将被创建在当前分支的最新状态上。
如果您处于分离的 HEAD 模式,请参阅"Git:如何协调分离的HEADmaster/origin",了解将分离的提交与分支进行协调的各种方法。

当前的主分支已过时,如果我切换到它,就会丢失在v1.1和v1.2中应用的更改。 - Peter
1
@Peter,你把v1.1和v1.2的更改合并到主分支了吗? - stanley_manley
1
@stanley_manley Peter已经五年没有连接到Stack Overflow了(最后一次出现是在2016年6月15日)。他可能会回答,也可能不会 ;) - VonC

0

标签用于创建稳定的版本。如果要将该标签用于发布,请首先确保遵循标签命名约定。在Git Drupal存储库中使用标签,需要进入项目目录,例如:

git tag 7.x-1.0

标签创建后,您需要将标签推送到主存储库。单独执行push操作不会将标签发送到上游,您还需要添加--tags标志来告诉它将标签包含在push操作中:

git push --tags

如果您不想推送所有标签,也可以具体指定。例如:

git push origin tag 7.x-1.0

要检查和确认远程标签,命令是:

git tag -l


0
我是这样解决问题的:
git checkout -B master HEAD
git push --force origin master

虽然 SO 可以接受只包含代码的回答作为答案,但这并不被鼓励。好的答案应该包括解释,说明你的代码建议中关键部分是如何/为什么解决 OP 的问题的。考虑编辑以添加解释和/或文档链接。好的解决方案随着时间的推移会获得更多的赞成票,因为用户能够轻松地推断出你提供的见解来解决自己的编码问题,或者在第一时间预防问题的发生。 - SherylHohman

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