this question上的答案显示了如何有选择地推送本地提交,但似乎这些是提示上的本地提交。
如果我已经合并了来自原点的新更改,以便它们穿插我的提交,(并且最后一次提交是'合并'消息),那么我可以做些什么来推动其中一些提交?或者我需要在合并之前分支并重置/存储我想要遗漏的提交吗?
答案 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
的提示,branchB
和D2
也都在“开启”分支,因为B2
将这两个提交都作为其父项。
如果你不想B3
D2
,但 想要branchB
,你必须做一个新的(并且相当另外)commit-let称之为D1
- 其父项为B4
和B2
:
D1
再次M1 -- M2 -- M3 -- M4 <-- master
\
| ------B4 <-- branchB
| / |
B1 -- B2 -- B3 | <-- branchB-old [or abandoned entirely]
\ / |
D1 -- D2 | <-- develB
\ /
----------
只是命名一个分支提示,但这个提交与branchB
不同。
推动上述(与B3
的混乱)可能实际上将提交B4
推送到服务器,但只要没有标签,就没有人会看到它,它最终会从服务器上收集垃圾。