好的,我对Git并不熟悉。我被要求从某人的存储库中克隆存储库,然后使用该标记。所以这就是我所做的:
git clone someones_repo my_new_repo
git checkout tags/bla_bla_tag -b tag_branch
所以现在我在标签版本中,而不是在主分支中,而是在tag_branch中。
我做了更改,想要提交它们并将它们与我的主人合并,然后将我的更改交给我们的官方存储库(我认为他们称之为黄金回购)。这是我的担忧:
答案 0 :(得分:0)
当您从"标记"创建分支时,您创建一个指向提交的指针。标记指向提交,您的分支也类似于指向此提交的指针。如果没有更多信息,这个提交是否在主分支上是不可能的。
要获得最新的主人,您可以git fetch
,最新的主人将在origin/master
。
例如,如果您基于标记的提交创建了一个提交,则可以通过以下方式提交:
git checkout master
git pull -r
git cherry-pick <your commit>
git push origin master
用简单的英语表示这意味着。结帐当地主人。更新本地主站以匹配远程主站。将新提交放在本地主服务器上,并更新本地主服务器以指向此提交。将本地主服务器提供给远程主服务器。
答案 1 :(得分:0)
我不确定你的意思是“将主要回购交易变为”。我希望它是一个拉动请求,而不是直接推向黄金回购
您当地分行的主人将与该人的回购的主人相同。它可能与黄金回购的主人相同,如果这两个回购定期保持同步。
标记只是您添加到某个提交的标签,通常用于master中的提交。如果您的pull请求已合并,则gold repo中的master将成为您的master版本。如果某人克隆了黄金回购,他们将收到您的请求版本。
我建议使用拉取请求工作流程。否则失败的机会非常高
答案 2 :(得分:0)
已经有一些好的答案,但你真正可以使用的是图解说明。
理解分支和标记在Git中如何工作的关键是要意识到分支和标记名称仅仅是辅助工具。他们对制作分支很少做。这个词&#34;分支&#34;本身在Git中实际上是模棱两可的。要查看更多相关信息和几个图表,请单击What exactly do we mean by "branch"?这将描述分支标签如何选择特定提交,尽管不是分支增长的过程。 (另请注意,Pro Git书中的第一张图片很好,但是像Jubobs一样,我不喜欢第二张Pro Git图片。)
我在StackOverflow帖子中使用了一个更简单的图表方法。只需三次提交即可获取存储库的示例图。这三个提交中的每一个都有一个实际的哈希ID - 其中一个丑陋的40个字符的东西,缩写为badf00d
和cafedad
等等 - 但我只是给它们一个字母的名字,然后放右边的分支名称:
A <- B <- C <-- master
此处C
是我们在分支master
上的最新提交。分支名称 master
包含提交C
的实际哈希ID,例如ac0ffee4cafedad5badf00d...
或其他。提交C
本身 - 存储在Git数据库中的实际提交 - 中包含提交B
的ID。我们说master
指向 C
,而C
指向B
。 B
的ID为A
,因此它指向A
。 A
是有史以来第一次提交,所以它无法指向任何地方。它没有父,用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
上进行两次新提交来实现此目的,即E
和F
,还可以通过创建新的分支名称,{{ 1}},指向commit sidebr
。然后我们D
并进行两次新的提交。这些是git checkout sidebr
和G
。当我们生成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)
对于你的问题:
git fetch origin
git log master..origin/master
如果有输出,这意味着您的本地主版不是最新版本,则应使用git pull
进行更改。
PS:如果您和您的同事都在为官方回购工作,您应该从第一个官方回购中克隆。