如何在Git中标记较早的提交?


949

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

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


我来到这里寻求帮助,以在本地和远程删除旧标签,最终发现它很有用,也许对其他人也有帮助:gist.github.com/mobilemind/7883996
Aleksander Lidtke

1
并且不要忘记如何使用Git将标签推送到远程存储库?因为Git不会做一些特殊的事情就不会推送标签。
jww

您可以使用提交哈希将标签添加到较早的提交中。这是语法:git tag -a <tagName> -m“标签消息” <commit hash>对于更高级的基础,这里是参考文献abhisheksharma.online/git-tags
Abhishek Sharma,

Answers:


1509

例:

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

9fceb02提交ID的开始部分在哪里。

然后,您可以使用推送标签git push origin v1.2

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

在Pro Git书中也有关于标记的很好的章节。

警告:这会创建带有当前日期的标签(例如,该值将显示在GitHub发布页面上)。如果您希望标签带有提交日期,请查看其他答案


45
您也可以在gitk的右键菜单中执行此操作-如果无论如何这就是找到SHA1的方便方式。
卡斯卡贝尔

62
如果您不想添加消息,请省略-a-m "Message here"部分:git tag v1.2 9fceb02
devius 2015年

3
您也可以使用完整的提交ID。
j08lue

1
@devius使用-a和之间有什么区别-m。手册页似乎在-a暗示何时-m使用。
约翰·斯特罗德

7
git push --tags origin master会将本地分支上的所有标签推送到远程。最好git push origin <tag_name>只推送创建的标签。请参阅:stackoverflow.com/a/5195913/452708、git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet

144

只是代码

# 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命令时),而不是提交日期。Git帮助tag包含“回溯标签”部分,内容为:

如果您已从另一个VCS导入了一些更改,并希望为您的主要版本添加标签,则能够指定嵌入标签对象内部的日期会很有用。标记对象中的此类数据会影响gitweb界面中标记的顺序。

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

例如:

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

页面“如何在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"

4
@ColonelPanic,您的愿望就是我的命令!github.com/lucasrangit/git-custom-commands/blob/master/...
卢卡斯

如果您使用Github管理发布并关心项目的/ tags页面上显示的日期,则设置GIT_COMMITTER_DATE特别重要!
莱斯利,

2
@ColonelPanic我给你双关语了,希望我能给你第二个双关语,但是github明星一定要做。
andyhasit



35

好的,您可以简单地执行以下操作:

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

因此,如果您想添加tag: 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

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

另外,我在下图中创建了步骤,以进一步说明步骤: 在提交哈希上创建标签

您也可以在Hub或在诸如SourceTree之类的工具中使用dd标签,以避免前面的步骤,我登录到Bitbucket在这种情况下并从那里进行操作:

  1. 转到您的分支,找到要将标签添加到的提交,然后单击它:

在bitbucket中找到您的提交

  1. 在右侧的提交页面中,找到其显示位置,No tags然后单击+图标:

找出没有标签的地方

  1. 在标签名称框中,添加标签:

添加标签名称

  1. 现在,您看到标记已成功创建:

在此处输入图片说明


11

这是一个古老的问题,答案已经可以解决所有问题,但是还有一个可以考虑的新选项。

如果您正在使用SourceTree管理git存储库,则可以右键单击任何提交并向其中添加标签。再次单击鼠标,您也可以将标签直接发送到原点的分支。


6

基于其他人的答案,这是一种单线解决方案,可将标签日期设置为实际发生的日期,使用带注释的标签,并且不需要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

where tag设置为所需的标记字符串和commit提交哈希。


3

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

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.