使用-b检出旧标记的Git会提取最新的提交

时间:2014-06-11 06:23:48

标签: git git-branch git-tag

我从gn开始,从SVN背景迁移出来,这对我来说是相当新的。我一直在使用基于git-flow的工作流程,并使用数字标准(如v0.2.0)标记版本

今晚我从沙箱部署到主站点并注意到如果我做了一个git checkout -b tags/v0.2.2,它实际上从主分支中提取了最新的提交。但是如果我在一个分离的头状态(即git checkout /tags/v0.2.2中检出相同的标签,它会根据正确的提交从主服务器中检出。

[ calllog]$ git branch
* master
[ calllog]$ git checkout tags/v0.2.2
Note: checking out 'tags/v0.2.2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at d5b4c5e... Merge branch 'feature/password' into develop
[ calllog]$ git describe
v0.2.2
[ calllog]$ git checkout master
Previous HEAD position was d5b4c5e... Merge branch 'feature/password' into develop
Switched to branch 'master'
[ calllog]$ git checkout -b tags/v0.2.2
Switched to a new branch 'tags/v0.2.2'
[ calllog]$ git describe
v0.2.4-5-gb2cfa6a

这种行为似乎只在检出不是最新的标签

时发生
[calllog]$ git tag
v0.1.1
v0.1.2
v0.1.3
v0.1.4
v0.2.0
v0.2.1
v0.2.2
v0.2.3
v0.2.4

我错过了什么或这是正常行为吗?从基于git-flow标签的工作流程推广到生产环境的推荐范例是什么?

2 个答案:

答案 0 :(得分:2)

  

我不清楚的是为什么git checkout -b tags / v0.2.2会创建一个引用最新master提交的新分支(如上原始问题所示)

因为它被解释为您使用该命令git checkout -b创建的新分支的名称:

git checkout -b <new_branch> [<start_point>]
git checkout -b tags/v0.2.2

由于你没有指定“起始点”,git会获取当前的(起始点HEAD

请记住it is possible to have hierarchical branch names (branch names with slash)

如果要基于标记创建新分支,则:

git checkout -b newBranchName v0.2.2

并且您不会处于分离HEAD(如“Checkout GIT tag”中所述)。
根据代码newBranchName,您将在v0.2.2上。

答案 1 :(得分:2)

  

[ calllog]$ git checkout -b tags/v0.2.2

这是你的问题。 checkout -b表示为我正在检查的内容创建一个“新分支”,下一个arg是新分支的名称。您可以在对该命令的响应中看到它:

  

Switched to a new branch 'tags/v0.2.2'

你给了它新的分支名称,它就成功了,但你实际上没有结帐分支。 git将无分支结帐视为“a glorified no-op with a rather expensive side-effects to show only the tracking information, if exists, for the current branch”,因此您的新分支将基于您当前的结帐。

那么为什么一个无分支结账呢?因为大多数分支都不在当前的结账时间。

你想要的是

git checkout -b $newbranch v0.2.2 

(编辑:我看到你的标签没有tags/前缀,你希望基于它们的新分支有这个前缀。修复。)