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

Posted

技术标签:

【中文标题】如何在 Git 中标记较旧的提交?【英文标题】:How to tag an older commit in Git? 【发布时间】:2011-05-23 04:41:25 【问题描述】:

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

那么如何给任意的旧提交添加标签呢?

【问题讨论】:

我来到这里寻求帮助,在本地和远程删除旧标签,最终发现这很有用,也许它也会帮助其他人:gist.github.com/mobilemind/7883996 别忘了How to push a tag to a remote repository using Git?,因为Git不会在没有做一些特别的事情的情况下推送标签。 【参考方案1】:

例子:

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

9fceb02 是提交 ID 的开始部分。

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

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

Pro Git 书中也有关于tagging 的好章节。

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

【讨论】:

您也可以在 gitk 的右键菜单中执行此操作 - 如果这就是您找到 SHA1 的方式,那会很方便。 如果您不想添加消息,请省略 -a-m "Message here" 部分:git tag v1.2 9fceb02 你也可以使用完整的提交 ID。 @devius 使用-a-m 有什么区别。当使用-m 时,手册页似乎说-a 是隐含的。 git push --tags origin master 会将本地分支上的所有标签推送到远程。更喜欢 git push origin <tag_name> 只推送创建的标签。参考:***.com/a/5195913/452708,git-scm.com/book/en/v2/Git-Basics-Tagging【参考方案2】:

只是代码

# 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"

【讨论】:

@ColonelPanic,你的愿望就是我的命令! github.com/lucasrangit/git-custom-commands/blob/master/… 如果您使用 Github 管理发布并关心项目 /tags 页面上显示的日期,设置 GIT_COMMITTER_DATE 尤为重要! @ColonelPanic 我给了你一个双关语,希望我能给你第二个代码,但是 github 之星必须这样做。 在 VSCODE (windows) 上,为什么会出现这个错误? The term 'GIT_COMMITTER_DATE=$(git show --format=%aD | head -1)' is not recognized as the name of a cmdlet, function, script file, or operable program. @MuhammadYasirroni 这些命令是 Linux shell 命令,不能在 Windows 上运行。【参考方案3】:

最简单的方法是:

git tag v1.0.0 f4ba1fc
git push origin --tags

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

【讨论】:

【参考方案4】:

这是一个老问题,已经给出的答案都有效,但还有一个新选项可以考虑。

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

【讨论】:

【参考方案5】:

使用命令:

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?

【讨论】:

【参考方案6】:

好的,你可以这样做:

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等工具,为了避免前面的步骤,我在此登录到我的Bitbucket案例并从那里开始:

    进入你的分支,找到你想要添加标签的commit并点击:

    提交页面右侧,找到No tags 并点击+ 图标:

    在标签名称框中,添加您的标签:

    现在您看到标签已成功创建:

【讨论】:

【参考方案7】:

在其他人的答案的基础上,这是一个单行解决方案,将标记日期设置为实际发生的时间,使用带注释的标记并且不需要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 设置为提交哈希。

【讨论】:

【参考方案8】:

@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

【讨论】:

以上是关于如何在 Git 中标记较旧的提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何恢复到几个较旧的提交,包括合并,但在恢复提交的头部有一个提交? [关闭]

你如何恢复到 Git 中的特定标签?

如何获取较旧的 SDK,我需要吗?

如何在现有较旧的 android 项目中使用最新 API 添加 Google Map?

如何在较旧的 GPU 上测试 OpenGL 应用程序?

如何修改旧的 Git 提交? [复制]