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

时间:2016-05-12 22:59:40

标签: git git-branch git-push git-detached-head

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

如果我在本地仓库中创建分离提交并创建标记,那么我可以签出标记以返回到该状态。我想与远程仓库分享,以便其他用途可以克隆仓库并签出标签并进入相同的状态。

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

2 个答案:

答案 0 :(得分:7)

是的,这个 - “这个”我的意思是主要的问题,“你能推出一个标记但不包含分支的提交吗?” - 完全没问题。请注意,git push通过调用其他一些Git(例如,ssh:// ...或https:// ...通过Internet电话调用其他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

这里的棘手问题是,在推送过程中,您不知道他们是否已经拥有分支newbranch或标记newtag。如果你自己设置了一个标签,并且一直都是从它们那里获取标签,你可能有一个好主意 - 当然不是保证 - 他们也没有这个标签。

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

答案 1 :(得分:0)

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