提交标签以及如何与最新版本的Git存储库合并

时间:2017-02-22 06:06:07

标签: 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_branch中。

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

  1. 这个"主人"分支,它是否包含我克隆的最新版本的repo?或者它是否包含标签的版本?
  2. 如果master是标签的版本,然后我将我的更改合并到它,那么如果我将这些合并的更改交给我们的官方仓库会发生什么?官方仓库的最新版本会成为我合并更改的版本吗?如果有人试图克隆官方仓库,那么他会不会得到我的合并版本?。

4 个答案:

答案 0 :(得分:0)

当您从"标记"创建分支时,您创建一个指向提交的指针。标记指向提交,您的分支也类似于指向此提交的指针。如果没有更多信息,这个提交是否在主分支上是不可能的。

要获得最新的主人,您可以git fetch,最新的主人将在origin/master

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

git checkout master
git pull -r
git cherry-pick <your commit>
git push origin master

用简单的英语表示这意味着。结帐当地主人。更新本地主站以匹配远程主站。将新提交放在本地主服务器上,并更新本地主服务器以指向此提交。将本地主服务器提供给远程主服务器。

答案 1 :(得分:0)

我不确定你的意思是“将主要回购交易变为”。我希望它是一个拉动请求,而不是直接推向黄金回购

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

  2. 标记只是您添加到某个提交的标签,通常用于master中的提交。如果您的pull请求已合并,则gold repo中的master将成为您的master版本。如果某人克隆了黄金回购,他们将收到您的请求版本。

  3. 我建议使用拉取请求工作流程。否则失败的机会非常高

答案 2 :(得分:0)

已经有一些好的答案,但你真正可以使用的是图解说明。

理解分支和标记在Git中如何工作的关键是要意识到分支和标记名称仅仅是辅助工具。他们对制作分支很少做。这个词&#34;分支&#34;本身在Git中实际上是模棱两可的。要查看更多相关信息和几个图表,请单击What exactly do we mean by "branch"?这将描述分支标签如何选择特定提交,尽管不是分支增长的过程。 (另请注意,Pro Git书中的第一张图片很好,但是像Jubobs一样,我不喜欢第二张Pro Git图片。)

我在StackOverflow帖子中使用了一个更简单的图表方法。只需三次提交即可获取存储库的示例图。这三个提交中的每一个都有一个实际的哈希ID - 其中一个丑陋的40个字符的东西,缩写为badf00dcafedad等等 - 但我只是给它们一个字母的名字,然后放右边的分支名称:

A <- B <- C   <-- master

此处C是我们在分支master上的最新提交。分支名称 master包含提交C的实际哈希ID,例如ac0ffee4cafedad5badf00d...或其他。提交C本身 - 存储在Git数据库中的实际提交 - 中包含提交B的ID。我们说master 指向 C,而C指向BB的ID为A,因此它指向AA是有史以来第一次提交,所以它无法指向任何地方。它没有,用Git的术语;它是 root commit

请注意,在此系统中,家长承诺不知道他们有哪些孩子,但孩子知道他们的父母。为了在master上进行新的提交,Git将一些内容写入数据库,以新的提交对象结束。新的commit-let称之为D - 包含当前提交的ID作为其父ID,以便D指回C。然后Git更新分支名称master,使其指向D

A <- B <- C <- D

(正如有人最近指出的那样,这很像挖掘家谱记录:你会发现像鲍勃琼斯这样的东西,父母亚瑟和萨莉出生的#34;显然鲍勃的出生记录< em> can&#t; 列出25年后他将有一个女儿,所以它不会。同样,当你做出提交时,Git知道提交者是谁 parent 是,但它不知道提交是否会有子项。)

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

...--D--E--F   <-- master
      \
       G--H    <-- sidebr

我们通过在master上进行两次新提交来实现此目的,即EF,还可以通过创建新的分支名称,{{ 1}},指向commit sidebr。然后我们D并进行两次新的提交。这些是git checkout sidebrG。当我们生成H时,提交G是最新的,并且是D指向的内容。因此,Git将sidebr作为其父项进行提交,并将D更改为指向sidebr。既然G是最新的,我们会以G作为其父项进行新的提交H,并将G更新为指向sidebr,并且&#39;}我们如何得到这个图。

标签时间

现在是时候为这些图片添加标签了。标签几乎(但不完全)与分支相同。与分支名称一样,标记名称​​指向提交。关键区别 1 是分支名称​​假定移动:它们通过添加新提交自动增长。标签名称​​不应该移动。

因此,我们不妨将它们画在内部&#34;内部&#34;提交图,而不是右边的方法。 (或者,如果我们有颜色,我们可以为分支和标签名称使用不同的颜色 - 但我不能在StackOverflow上的文本中使用颜色。)因此,让我们添加一个指向commit H的标记名称:< / p>

E

此标记指向提交 tag:v0.1 | v ...--D--E--F <-- master \ G--H <-- sidebr 。应始终,永远 - 更多,指向提交E 2 关于原始Git哈希ID的一个有趣的事实在这里非常相关:哈希ID是完全确定的,并完全基于提交(或其他Git对象)的实际内容。因此,标记名称只是为那些糟糕的哈希ID之一提供了一个人类可读的名称。如果我们都可以记住E,我们就不需要Git存储库中的标记17f9f635c101aef03874e1de1d8d0322187494b3用于Git,但我&#39; m 当然不会记住这一点。 3

在任何情况下,您都可以v2.6.0通过其ID或任何解析其ID来提交任何提交。标签名称适用于后者,当然,更容易记住。因此,如上图所示,我们可以使用以下命令检查提交git checkout

E

git checkout v0.1 不是标签名称的一部分,只是我写的内容,说明为什么我们这里有箭头)。然而,这给了我们一个&#34;分离的HEAD&#34;,这就是为什么我们tag::指定一个新的分支名称指向提交。现在我们需要重新绘制图形以提供更多空间:

git checkout -b newbranch v0.1

我还添加了这个 tag:v0.1 | | F <-- master v / ...--D--E <-- newbranch (HEAD) \ G--H <-- sidebr 内容:这提醒我们现在 on 这个新分支。如果我们现在进行新的提交,这将以通常的方式增加分支:

HEAD

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

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

2 可以强行移动标签,或者删除它并重新创建它指向不同的提交。有时甚至有充分的理由这样做。你只需要确定原因特别好,因为标签实际上只是一个人类可读的哈希ID名称,而且任何已经有旧标签的存储库都可能会认为旧的标签 - 哈希 - 即使你强行移动了标签,ID映射仍然是正确的。

3 我使用newbranch来查找它。上面的哈希ID是带注释的标记对象的ID(您可以通过克隆Git的Git存储库找到它)。实际提交是git rev-parse v2.6.0。使用be08dee9738eaaa0423885ed189c2b6ad8368cf0可以在一个步骤中找到提交ID的特殊语法,或者您可以使用git rev-parse来读取标记对象,然后使用git show v2.6.0标记的目标对象例如,查看提交。

答案 3 :(得分:0)

对于你的问题:

  1. 对于您克隆的repo,只能确定您克隆的时间是最新版本。如果您的同事在克隆后对其回购进行了一些更改,那么您的本地回购不是最新版本。克隆的回购包含存在于同事回购中的标签。有一种方法可以通过以下方式检查您的本地仓库是否为最新版本:
  2. git fetch origin git log master..origin/master

    如果有输出,这意味着您的本地主版不是最新版本,则应使用git pull进行更改。

    1. 如果您使用的标签位于master分支上,并且您将更改合并到master中,则官方repo的最新版本将成为您合并的新版本。之后,如果没有克隆官方仓库,master分支最新版本也是你合并的版本。
    2. PS:如果您和您的同事都在为官方回购工作,您应该从第一个官方回购中克隆。