提交标记以及它如何与最新版本的Git Repository合并
好吧,我对Git不太熟悉。我被要求从某人的存储库克隆一个存储库,然后使用标签。以下是我所做的:提交标记以及它如何与最新版本的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 clone someones_repo my_new_repo
git checkout tags/bla_bla_tag -b tag_branch
现在我在tag版本中,不是在master分支中,而是在tag_分支中
我做了一些更改,希望提交这些更改并将它们与我的主人合并,然后将更改提交到我们的官方存储库(我想他们称之为黄金回购)。以下是我的担忧:
当您创建“标记”的分支时,您创建了一个指向提交的指针。标记指向一个提交,而您的分支也类似于指向该提交的指针。如果没有更多信息,就无法确定此提交是否在主分支上 要获取最新的母版,您可以执行
git fetch
,最新的母版将位于origin/master
例如,如果已基于标记的提交创建了一个提交,则可以通过以下方式交付:
git checkout master
git pull -r
git cherry-pick <your commit>
git push origin master
git签出主机
git pull-r
吉特樱桃采摘
git推送源主机
用简单的英语来说,这意味着。签出本地主机。更新本地主机以匹配远程主机。将新的提交放在本地主机的顶部,并更新本地主机以指向此提交。将本地主机交付给远程主机。我不确定您所说的“将更改提交到主回购”是什么意思。我希望这是一个拉动请求,而不是直接推动黄金回购
我建议为此使用pull请求工作流。否则,丢失提交的可能性非常高已经有一些很好的答案,但这里真正可以使用的是一个图形说明 理解Git中分支和标记的工作原理的关键是认识到分支和标记名只是辅助项。他们几乎不做任何实际的分支。“分支”这个词本身在Git中实际上是模棱两可的。要了解更多关于此的信息以及一些图表,请单击此处,说明分支标签如何选择特定的提交,而不是分支增长的过程。(还要注意,Pro-Git书籍中的第一个图像很好,但与Jubobs一样,我不喜欢第二个Pro-Git图像。) 我在StackOverflow过账中使用了一种更简单的图解方法。以这个仅包含三次提交的存储库的示例图为例。这三个提交中的每一个都有一个实际的hash ID,这是一个巨大的、丑陋的40个字符的东西,缩写为
badf00d
和cafedad
等等,但我只给它们一个字母的名称,并将分支名称放在右边:
A <- B <- C <-- master
(正如最近有人指出的那样,这很像是在翻阅家谱记录:你会发现类似“鲍勃·琼斯,父母亚瑟和莎莉所生”的东西.显然,Bob的出生记录不能列出25年后他会有一个女儿,所以事实并非如此。同样,当你做出承诺时,Git知道承诺的父母是谁,但它不知道承诺是否会有孩子。)
考虑到这一点,考虑这个图形片段。我已经停止绘制内部箭头以节省空间等,但请记住,它们总是向后指向(在这些图形中是向左的):
此标记指向提交E
。它应该永远指向commitE
。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