合并后仅推送一些本地提交

时间:2013-09-16 22:46:02

标签: git git-merge git-push

this question上的答案显示了如何有选择地推送本地提交,但似乎这些是提示上的本地提交。

如果我已经合并了来自原点的新更改,以便它们穿插我的提交,(并且最后一次提交是'合并'消息),那么我可以做些什么来推动其中一些提交?或者我需要在合并之前分支并重置/存储我想要遗漏的提交吗?

1 个答案:

答案 0 :(得分:1)

您需要创建一个参考相关提交的refspec,并推送refspec。

背后的原因有点混乱,因为它是。以push(或任何其他对象传输顺序)传输的实际对象集合不一定限于您可能想到的内容。有时推送将推送“未使用的”repo对象,因为客户端(执行推送)和服务器(接收对象包)之间的同步被松散地指定。它保证所有必需的对象都可以使用它,但可以推送一些不是必需的。它实际上可能需要更多的沟通来找出“什么是必要的”,而不仅仅是推动一切,特别是在发送/接收序列中进行所有压缩。

因此,“推”内部发生的事情是客户端通过一个装满对象的大球(特别是“瘦包”)发送,然后 - 在这些对象被安全地放入服务器的repo-sending之后通过一组“参考标签”:

refs/heads/zorg = object 00ac1d1f1ab1ec0ffee5c01ec0idf1dd1edeedee
refs/tags/skin = object 5011d1f1ab1ebac1110515be11e5be111c05ed0e

等等。服务器通过git pre-receive和update挂钩运行这些ref-updates以验证它们是否正常,如果是,则将它们存储在服务器的refs中。 (如果需要,钩子可以检查这些对象。这使钩子检查标签是否“轻量级”,直接引用提交,或“注释”,例如引用仓库中的标签对象。)


我将在此添加,我认为您的问题意味着对分支实际工作方式的误解。分支是“隐含的”数据结构。 Git有两个基本概念,它们协调创建一个“分支”:它有一个分支尖标签,它命名一个单一的提交;并且它具有提交,每个提交带有零个或多个“父提交”ID。例如,master分支是分支尖端名称(refs/heads/master)的原因。但这只会让你获得一次提交,即分支的提示。要查找分支上的“on”,您可以从那里开始查看该提交的父级或父级。在那一刻,每个父提交也在“{1}}分支上”,每个父母的父母都在其上,依此类推。如果你有:

master

然后提交M1 -- M2 -- M3 -- M4 <-- master \ B1 -- B2 -- B3 <-- branchB \ / D1 -- D2 <-- develB “开启”B3,因为它是branchB的提示,branchBD2也都在“开启”分支,因为B2将这两个提交都作为其父项。

如果你不想B3 D2,但 想要branchB,你必须做一个新的(并且相当另外)commit-let称之为D1 - 其父项为B4B2

D1

再次M1 -- M2 -- M3 -- M4 <-- master \ | ------B4 <-- branchB | / | B1 -- B2 -- B3 | <-- branchB-old [or abandoned entirely] \ / | D1 -- D2 | <-- develB \ / ---------- 只是命名一个分支提示,但这个提交与branchB不同。

推动上述(与B3的混乱)可能实际上将提交B4推送到服务器,但只要没有标签,就没有人会看到它,它最终会从服务器上收集垃圾。