如何在Git中标记旧的提交?

时间:2010-12-09 23:23:17

标签: git version-control git-tag

我们是git的新手,我想在我们的存储库的开头设置一个标记。 我们的生产代码与初始存储库相同,但从那时起我们就已经提交了。 开头的标签可以让我们将生产“回滚”到一个已知的稳定状态。

那么如何将标签添加到任意较旧的提交中?

8 个答案:

答案 0 :(得分:1315)

示例:

git tag -a v1.2 9fceb02 -m "Message here"

其中9fceb02是提交ID的开头部分。

然后,您可以使用git push --tags origin master

推送它们

您可以git log显示当前分支中的所有提交ID。

在Pro Git书中,tagging还有一个很好的章节。

警告:这会使用当前日期创建标记(例如,该值将显示在github发布页面上)。如果您希望标记与提交日期一致,请查看another answer

答案 1 :(得分:113)

只是代码

# Set the HEAD to the old commit that we want to tag
git checkout 9fceb02

# temporarily set the date to the date of the HEAD commit, and add the tag
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" \
git tag -a v1.2 -m"v1.2"

# set HEAD back to whatever you want it to be
git checkout master

详细信息

@dkinzer的答案创建的标签的日期是当前日期(运行git tag命令时),不是提交日期。 tag的Git帮助包含 "On Backdating Tags" 部分,其中包含:

  

如果您从其他VCS导入了一些更改,并且想为工作的主要版本添加标记,那么能够指定嵌入标记对象内部的日期是很有用的。例如,标签对象中的此类数据会影响gitweb界面中标签的排序。

     

要设置将来标记对象中使用的日期,请设置环境变量GIT_COMMITTER_DATE(请参阅后面对可能值的讨论;最常见的形式是“YYYY-MM-DD HH:MM”)

     

例如:

$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1

页面 "How to Tag in Git" 告诉我们,我们可以通过以下方式提取HEAD提交的时间:

git show --format=%aD  | head -1
#=> Wed, 12 Feb 2014 12:36:47 -0700

我们可以通过以下方式提取特定提交的日期:

GIT_COMMITTER_DATE="$(git show 9fceb02 --format=%aD | head -1)" \
git tag -a v1.2 9fceb02 -m "v1.2"

但是,不是重复提交两次,而是将HEAD更改为该提交并在两个命令中隐式使用它似乎更容易:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"

答案 2 :(得分:76)

最简单的方法是

git tag v1.0.0 f4ba1fc

f4ba1fc是您要标记的提交哈希的开头,v1.0.0是您要标记的版本。

答案 3 :(得分:30)

使用命令:

git tag v1.0 ec32d32

其中v1.0是标记名称,ec32d32是要标记的提交

完成后,您可以通过以下方式推送标签:

git push origin --tags

参考:

Git (revision control): How can I tag a specific previous commit point in GitHub?

答案 4 :(得分:21)

确定,您只需执行以下操作:

git tag -a <tag> <commit-hash>

因此,如果您想添加标记: 1.0.2来提交e50f795,只需执行以下操作:

git tag -a 1.0.2 e50f795

另外,您最后使用-m添加了一条消息,如下所示:

git tag -a 1.0.2 e50f795 -m "my message"

毕竟,您需要将其推送到remote,为此,只需执行以下操作:

git push origin 1.0.2 

如果您有许多标签,您不想一个一个地提及它们,只需执行以下操作:

git push origin --tags

将所有标签推到一起......

另外,我创建了下图中的步骤,以便更详细地说明这些步骤: creating tag on a commit hash

你也可以在集线器或使用像 SourceTree 这样的工具中删除标记,以避免之前的步骤,我登录到我的 Bitbucket 案件并从那里开始:

  1. 转到您的分行,找到要添加标记的提交,然后点击它:
  2. find your commit in bitbucket

    1. 提交页面的右侧,找到No tags的位置,然后点击+图标:
    2. find where it says No tags

      1. 在标记名称框中,添加标记:
      2. add tag name

        1. 现在您看到标记已成功创建:
        2. enter image description here

答案 5 :(得分:10)

这是一个老问题,答案已经完成所有工作,但也有一个新选项可以考虑。

如果您正在使用SourceTree来管理您的git存储库,您可以右键单击任何提交并向其添加标记。使用另一个鼠标点击,您还可以将标记直接发送到原点上的分支。

答案 6 :(得分:4)

基于其他答案,这是一种单行解决方案,可以将标签日期设置为实际发生的时间,使用带注释的标签,并且不需要git checkout

tag="v0.1.3" commit="8f33a878" bash -c 'GIT_COMMITTER_DATE="$(git show --format=%aD $commit)" git tag -a $tag -m $tag $commit'
git push --tags origin master

其中tag设置为所需的标记字符串,commit设置为提交哈希。

答案 7 :(得分:2)

@Phrogz的answer很不错,但在Windows上不起作用。以下是使用Powershell使用提交的原始日期标记旧提交的方法:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master