我们假设有两种情况:
直接在共享开发人员分支上工作:在rebase之后推送是否也会传输在此rebase之前所做的所有提交?
在一个单独的测试分支&合并到开发人员分支:在rebase之后推送开发人员分支是否也会传输在rebase和后续合并之前进行的所有提交(test->开发人员),即使是快进模式?
答案 0 :(得分:3)
Schleis' answer是正确的,但为了更深入一点,git push [remote [refspecs ...]]
的“正常”(但优化)过程就是这样的。我们将你的计算机 1 / git-push-process拟人化并将其命名为“Bob”,以及所谓的遥控器“Rem”。交流是这样的:
BOB:“嗨,我有一些分支机构适合你,你有什么?”
REM:“我有master
,deploy
,develop
和test
。”
BOB:“好的,所以我作为cabfa4e
的负责人develop
作为fedcafe
的负责人提交test
,我想发送你需要什么。“
REM:“我已经在fedcafe
上test
了,但badf00d
已develop
...”
BOB:“啊,好吧,我在这里看到badf00d
,我会给你这些新的提交和树/ blob /标签对象[交出长的对象数据列表,打包成”瘦“包]“。
REM:[暂停消化包,运行各种钩子,验证Bob给他的东西是否正常,并且可以更新develop
;如果一切顺利]“谢谢鲍勃!”
(当此对话结束时,Bob知道Rem-the-remote现在位于分支cabfa4e
上的develop
,因此Bob也会更新remotes/rem/develop
。)
所有这一切的要点是Bob和Rem不知道,甚至不关心他们如何进入他们交换数据时所处的状态,而Bob发送了新的git-objects (提交,树,blob和/或带注释的标签)。当他们完成后,Rem拥有Bob发送的任何内容,如果他“接受”它(没有“拒绝”参考更新),Bob会更新他的Rem记录。
同样重要的是,鲍勃只是向雷德提供了refspecs。
假设您决定“快退”(“删除”)一个或多个提交,从cabfa4e
返回badf00d
,并执行强制推送。谈话有点短 - 雷姆已经拥有了所有的对象 - 而且雷姆会说“不,不能做,因为我不回复提交”的可能性更大。鲍勃会告诉雷姆,你要求推动被“强制”(雷姆仍然可以说“不”,但“内置默认”是“除非强制”,你要求“强制”)。
或者,假设你确实不决定倒退任何东西,但是Rem早些时候已经从Jan获得了新的提交,而你的计算机上却没有它们。 Rem现在在develop
提交c0ffeee
,而Bob根本没有。{1}}他们最早的同步点(仍然)在badf00d
。 Bob可以向Rem提议:“我们将develop
设置为cabfa4e
,我会向您提供从badf00d
到cabfa4e
的所有内容。”雷姆会说“不,你错过了什么(也就是说,这不是快进的。)除非你说力,否则我不会这样做。”这取决于您获取 - 和 - (合并/转换),更新Bob以获得c0ffeee
(以及其他提交)。
这都是提交图。您(通过Bob)建议远程(Rem)通过将refs/heads/
标签更改为指向不同的提交来更改Rem的提交图的某些部分;而你(鲍勃)提供图表的新部分,以及所需的任何其他对象;然后遥控器(Rem)根据Rem的规则(挂钩)说“OK”或“不行”。默认的内置规则是:“如果refs/heads/
标签以快进方式移动,则为是。否则,如果是强制则为是,否则为否。”
1 “不要将计算机拟人化;他们讨厌这种情况。”
答案 1 :(得分:1)
git push
尝试将远程存储库更新为与您正在推送的本地分支相同的状态。因此,只要历史记录兼容,该分支中的任何提交都将添加到远程。您没有推动单个提交,而是整个分支的状态。