我可以在分离HEAD状态下提交的提交吗?

8

我想使用git进入分离HEAD状态并创建一个新的提交。然后我想创建一个标签,并将'detached commit'和标签一起推送到远程仓库。这个可行吗?

如果我在本地仓库中创建了分离的提交并创建了一个标签,那么我可以检出该标签以返回到该状态。我想共享它到远程仓库,以便其他用户可以克隆仓库并检出该标签以达到相同的状态。

我这样做的原因是因为构建过程需要在文件中捕获版本号,但我不想将其提交到正在进行开发的分支中。我希望提交是独立的,但也希望捕获提交并打上标签,以便任何人都可以检出标签和包含在构建中的文件。是否建议将提交推送到不同的分支,例如"build"?


只为它检出一个新分支有什么问题吗? - Jeff Puckett
@JiriKremser:那也可以,但是会推送所有标签,可能比预期的多。 - torek
没错,可以通过 git push <remote> <foo> 来缩小范围,其中 foo 是标签的名称。 - Jiri Kremser
2个回答

10
是的,这个问题——即“你能推送一个有标签但不包含在分支中的提交吗?”——是完全可以的。请注意,git push的工作方式是调用其他Git(例如,ssh://...或https://...通过互联网电话呼叫其他Git),如果必要的话传递一些提交,并然后请求该其他Git:“请将引用名称设置为指向某些特定的提交”。
由于您有一个标签,您可以请求该其他Git将相同的标签设置。假设远程命名为origin(通常是这样):
git push origin <tag>

您可以在需要时拼写完整的名称refs/tags/tag。如果标签名称与分支名称容易区分(例如,标签为v2.x而分支从不以v开头),则永远不需要这样做(但通常仍然明智)。
如果您没有标签,仍然可以这样做,但您必须为其他Git提供一个名称。要执行此操作,您可以执行以下操作:
git push origin HEAD:refs/heads/newbranch

或者:

git push origin HEAD:refs/tags/newtag

这里的棘手之处在于,在推送期间,您无法确定他们是否已经有一个名为newbranchnewtag的分支或标签。如果您自己设置了标签,并一直从他们那里获取,您可能已经很清楚(当然不是绝对),他们还没有该标签。
请注意,如果他们确实拥有该名称,并且您委婉地要求他们将其更改为指向其他提交,他们可能会拒绝。这就是当您看到推送时出现rejected错误的原因。您可以通过git push --force或在refspec上使用+前缀语法来命令它们,但通常不是正确的选择,而且他们仍然可以拒绝(这部分取决于谁控制另一个Git)。

0

git tag mytag git push origin mytag:mytag 这里的mytag:mytag等同于refs/tags/mytag:refs/tags/mytag


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接