提交标记以及它如何与最新版本的Git Repository合并

提交标记以及它如何与最新版本的Git Repository合并,git,version-control,git-merge,git-tag,Git,Version Control,Git Merge,Git Tag,好吧,我对Git不太熟悉。我被要求从某人的存储库克隆一个存储库,然后使用标签。以下是我所做的: git clone someones_repo my_new_repo git checkout tags/bla_bla_tag -b tag_branch 现在我在tag版本中,不是在master分支中,而是在tag_分支中 我做了一些更改,希望提交这些更改并将它们与我的主人合并,然后将更改提交到我们的官方存储库(我想他们称之为黄金回购)。以下是我的担忧: 这个“主”分支,是否包含我克隆的回购协

好吧,我对Git不太熟悉。我被要求从某人的存储库克隆一个存储库,然后使用标签。以下是我所做的:

git clone someones_repo my_new_repo
git checkout tags/bla_bla_tag -b tag_branch
现在我在tag版本中,不是在master分支中,而是在tag_分支中

我做了一些更改,希望提交这些更改并将它们与我的主人合并,然后将更改提交到我们的官方存储库(我想他们称之为黄金回购)。以下是我的担忧:

  • 这个“主”分支,是否包含我克隆的回购协议的最新版本?或者它是否包含标签的版本
  • 如果master是标签的版本,然后我将我的更改合并到它,那么如果我将这些合并的更改提交到我们的官方回购协议中会发生什么?官方回购协议的最新版本会成为我的合并变更版本吗?如果有人试图克隆官方回购协议,那么他会得到我的合并版本吗

  • 当您创建“标记”的分支时,您创建了一个指向提交的指针。标记指向一个提交,而您的分支也类似于指向该提交的指针。如果没有更多信息,就无法确定此提交是否在主分支上

    要获取最新的母版,您可以执行
    git fetch
    ,最新的母版将位于
    origin/master

    例如,如果已基于标记的提交创建了一个提交,则可以通过以下方式交付:

    git checkout master
    git pull -r
    git cherry-pick <your commit>
    git push origin master
    
    git签出主机
    git pull-r
    吉特樱桃采摘
    git推送源主机
    

    用简单的英语来说,这意味着。签出本地主机。更新本地主机以匹配远程主机。将新的提交放在本地主机的顶部,并更新本地主机以指向此提交。将本地主机交付给远程主机。

    我不确定您所说的“将更改提交到主回购”是什么意思。我希望这是一个拉动请求,而不是直接推动黄金回购

  • 您当地分行的主管将与该人回购协议的主管相同。如果这两个回购协议定期保持同步,它可能与黄金回购协议的主人一样

  • 标记只是添加到某个提交中的标签,通常用于主控中的提交。如果您的拉取请求被合并,golden repo中的master将成为您的master版本。如果有人克隆了黄金回购协议,他们会得到你的请求版本


  • 我建议为此使用pull请求工作流。否则,丢失提交的可能性非常高

    已经有一些很好的答案,但这里真正可以使用的是一个图形说明

    理解Git中分支和标记的工作原理的关键是认识到分支和标记名只是辅助项。他们几乎不做任何实际的分支。“分支”这个词本身在Git中实际上是模棱两可的。要了解更多关于此的信息以及一些图表,请单击此处,说明分支标签如何选择特定的提交,而不是分支增长的过程。(还要注意,Pro-Git书籍中的第一个图像很好,但与Jubobs一样,我不喜欢第二个Pro-Git图像。)

    我在StackOverflow过账中使用了一种更简单的图解方法。以这个仅包含三次提交的存储库的示例图为例。这三个提交中的每一个都有一个实际的hash ID,这是一个巨大的、丑陋的40个字符的东西,缩写为
    badf00d
    cafedad
    等等,但我只给它们一个字母的名称,并将分支名称放在右边:

    A <- B <- C   <-- master
    
    (正如最近有人指出的那样,这很像是在翻阅家谱记录:你会发现类似“鲍勃·琼斯,父母亚瑟和莎莉所生”的东西.显然,Bob的出生记录不能列出25年后他会有一个女儿,所以事实并非如此。同样,当你做出承诺时,Git知道承诺的父母是谁,但它不知道承诺是否会有孩子。)

    考虑到这一点,考虑这个图形片段。我已经停止绘制内部箭头以节省空间等,但请记住,它们总是向后指向(在这些图形中是向左的):

    此标记指向提交
    E
    。它应该永远指向commit
    E
    。2关于原始Git哈希ID,这里有一个有趣的事实非常相关:哈希ID是完全确定的,并且完全基于commit(或其他Git对象)的实际内容。因此,标记名只不过是为其中一个糟糕的散列ID提供了一个人类可读的名称。如果我们都能记住
    17f9f635c101aef03874e1de1d8d0322187494b3
    ,我们就不需要Git存储库中的标签
    v2.6.0
    ,但我肯定不会记住。3

    在任何情况下,您都可以
    git checkout
    通过其ID或解析为其ID的任何内容进行任何提交。标记名适用于后者,当然,更容易记住。因此,根据上图,我们可以通过以下方式检查提交
    E

    git checkout v0.1
    
    (标签:不是标签名的一部分,只是我写的一句话来说明为什么这里有一个箭头)。然而,这给了我们一个“分离的头”,所以这就是为什么我们
    git checkout-b newbranch v0.1
    :它分配一个新的分支名称来指向提交。现在我们需要重新绘制一点图表,以提供更多空间:

         tag:v0.1
            |
            |  F   <-- master
            v /
    ...--D--E      <-- newbranch (HEAD)
          \
           G--H    <-- sidebr
    
    不应该移动的标签不会移动。然而,分支确实在移动。我们可以做出我们喜欢的任何承诺,每个承诺都会使当前分支-
    newbranch
    -前进以合并我们的每个新承诺


    1另一个重要区别是,标记名存在于所有存储库的共享名称空间中,而分支则不存在。还有带注释的标记,它使您有机会附加一些未解释的数据,Git允许您使用GPG加密对这些标记进行签名。但这是另一个讨论

    2可以强制移动标签,或
         tag:v0.1
            |
            v
    ...--D--E--F   <-- master
          \
           G--H    <-- sidebr
    
    git checkout v0.1
    
         tag:v0.1
            |
            |  F   <-- master
            v /
    ...--D--E      <-- newbranch (HEAD)
          \
           G--H    <-- sidebr
    
         tag:v0.1
            |
            |  F   <-- master
            v /
    ...--D--E--I   <-- newbranch (HEAD)
          \
           G--H    <-- sidebr