我可以推送在分离的 HEAD 状态下进行的提交吗

Can I push a commit made in detached HEAD state

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

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

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

是的,这个 "this" 我的意思是主要问题 "can you push a tagged but not branch-contained commit?" - 非常好。请注意,git push 通过调用其他一些 Git 来工作(例如,ssh://... 或 https://... 通过 Internet 调用其他 Git-phone), 如有必要,提交一些提交,然后询问其他 Git: "please set a reference name to point to some specific commit(s)".

既然你有一个标签,你可以要求其他 Git 请设置相同的标签。假设遥控器被命名为 origin(通常是这样):

git push origin <tag>

如果需要,您可以拼出全名,refs/tags/<em>tag</em>。如果标签名称很容易与分支名称区分开来(例如,标签是 v2.x 并且分支永远不会以 v 开头),则永远不需要它(但通常它可能仍然是明智的)。

如果您没有标签,您仍然可以这样做,但是您必须为另一个 Git 提供一个 name。为此,您可以执行以下操作:

git push origin HEAD:refs/heads/newbranch

或:

git push origin HEAD:refs/tags/newtag

这里的棘手之处在于,在推送期间,您不知道他们是否已经有分支 newbranch 或标签 newtag。如果您自己设置了标签,并且一直从他们那里获取标签,您可能有一个好主意——当然不能保证——他们也没有那个标签。

请注意,如果他们确实有那个名字,并且您礼貌地请求他们更改他们的名字以指向其他提交,他们可能会拒绝。这是当您从推送中看到 rejected 错误时。您可以命令它们(在 refspec 上使用 git push --force+ 前缀语法),但这通常不是正确的方法,而且它们仍然可以拒绝(这部分取决于控制另一部分的人) Git).

git tag mytag git push origin mytag:mytag 这里 mytag:mytag 相当于 refs/tags/mytag:refs/tags/mytag