Git: 有没有办法在不推送标签的情况下推送仅由标签持有的提交?

Git: Is there a way to push a commit only held by a tag, without pushing the tag?

场景:

  1. 创建一个 tmp 分支

  2. 提交一些临时更改

  3. 标记提交 tmptag

    x-x-x-y-y  <- master
         \
          z  <- tmp [tmptag]
    
  4. 删除tmp分支

    x-x-x-y-y  <- master
         \
          z  <- [tmptag]
    

现在我有一个提交 z 仅由标签 tmptag.

持有

我知道如果您将 tmptag 推送到远程(通过名称或通过推送所有标签),提交 z 也将被推送。

问题:

  1. 是否有任何其他命令可以将 z 推送到远程?

  2. 另外,如果具体我push所有分支,z不会不会被push吧?

  1. 是的,任何说 请求另一个 Git 请设置一些名称以指向 ID 为 z[=36= 的提交] 将转移提交 z。例如:

    git push $(git rev-parse tmptag^{}):refs/heads/newbranch
    

    会要求另一个 Git 创建分支 newbranch 指向标记的提交。 (当且仅当 tmptag 是带注释的标记时才需要 ^{} 后缀。)您还可以使用原始哈希 ID 和分支名称以外的其他内容,前提是另一个 Git允许您推送到该引用。

  2. 正确:因为 z 无法从分支名称访问,它将(至少通常 1)不会被发送。


1每个Git传输负责收集要发送和发送的对象,如果某些传输很奇怪或粗心什么的,它可以收集提交z 并发送。内置的推送传输(通常用​​ --thin 调用 git send-pack)不会那样做,但有趣的是考虑 z 是包中的基础对象的情况,并且一些 deltified同包中的对象也需要发送。