【问题标题】:Set master branch to latest tag将主分支设置为最新标签
【发布时间】:2012-12-27 11:56:29
【问题描述】:

这是我现在的 git repo 的示例:

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

我的主要问题是主分支没有移动到最新的标签,所以我总是处于Detached HEAD 状态。有什么办法可以解决这个问题,让主分支总是指向最新推送的标签?

【问题讨论】:

  • 您的工作流程是什么?为什么你总是处于分离的 HEAD 状态?你为什么不在分支上工作?我认为这是您的工作流程的问题,而不是其他任何问题。
  • 如果您不直接签出标签,则不会发生这种情况。仅在签出 branch 后才进行新提交,而不是 tag
  • 为了能够在 repo 中生成包文件,我需要标记它们,否则它们会变成 'a3fsr2' 例如,这就是我需要使用标记的原因。

标签: git tags push head master


【解决方案1】:

在这种特殊情况下,我必须执行以下操作:

  1. 首先设置master分支指向最新的标签(HEAD指向的地方),因为它是最新的标签。为此,我创建了一个新分支并将 master 合并到其中。
git branch -b exp
git merge -s ours master
git checkout master
git merge exp

现在master和latest标签一样:

v1.0    v1.1    v1.2
  |       |       |
  a   -   b   -   c
                  |
                 HEAD
                  |
                master
  1. 一旦我们将 master 恢复到位,我们需要在每次执行新提交时推送 master 和标签:
git commit -a -m "Commit msg"
git tag -a v1.4 -m "Tag msg"
git push master --tags

这样我们就可以避免处于 Detached HEAD 模式并且更新主分支。

【讨论】:

  • 有趣的反馈,比我的回答更完整。 +1
  • git checkout -B master HEAD 直接执行您的步骤 1。
【解决方案2】:

关于为什么不这样做的各种答案/cmets 已经给出,但这里是你如何解决这个特殊情况:

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 仅当您的标签都位于不同的开发线上时,您的原始问题不会出现这种情况。您将拥有一个分支,例如 master,其标签 v2.0 指向该分支上的最近提交,而较早的标签(例如 v1.9v1.8 ....)指向同一分支上的较早提交分支。一个分支应该指向“我下一次提交的父级”。上面的checkout 命令用于当您需要检查旧的(-er)标签以便为其准备错误修复或其他内容时,不适用于当前的开发......
【解决方案3】:

分支不引用标签。
一个标签引用了一个 fixed 提交。

所以只要你git checkout master,你就不是detached HEAD mode
然后您可以提交和标记:标记将在当前分支的 LATEST 上创建。

如果您处于分离的 HEAD 模式,请参阅“Git: How can I reconcile detached HEAD with master/origin?”了解协调分离提交与分支的各种方式。

【讨论】:

  • 当前的 master 分支已经过时,所以如果我签出它,我将丢失 v1.1 和 v1.2 中应用的更改。
  • @Peter 您是否将您的更改合并到 v1.1 和 v 1.2 的 master 中?
  • @stanley_manley Peter 已经有五年没有连接到 Stack Overflow(最后一次出现在 2016 年 6 月 15 日)。他可能会或可能不会回答;)
【解决方案4】:

标签用于创建稳定版本。要创建用于 Git Drupal 存储库的标签,首先,如果您使用此标签进行发布,请确保您遵循标签命名约定。在项目目录中,一个例子是:

git tag 7.x-1.0

创建标签后,您需要将标签推送到主存储库。 push 本身不会发送标签,您还需要通过附加 --tags 标志告诉它在推送中包含标签:

git push --tags

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

git push origin tag 7.x-1.0

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

git tag -l

【讨论】:

    【解决方案5】:

    我是这样解决问题的:

    git checkout -B master HEAD
    git push --force origin master
    

    【讨论】:

    • 虽然 SO 将接受纯代码响应作为答案,但不鼓励这样做。好的答案包括解释代码建议的基本部分如何/为什么解决 OP 的问题。考虑editing 添加和解释和/或文档链接。随着时间的推移,好的解决方案会获得更多的支持,因为用户可以轻松推断您提供的见解来解决他们自己的编码问题,或者首先防止出现问题。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多