git是否会在rebase之后推送所有本地提交?

时间:2013-11-13 16:35:32

标签: git git-push

我们假设有两种情况:

  1. 直接在共享开发人员分支上工作:在rebase之后推送是否也会传输在此rebase之前所做的所有提交?

  2. 在一个单独的测试分支&合并到开发人员分支:在rebase之后推送开发人员分支是否也会传输在rebase和后续合并之前进行的所有提交(test->开发人员),即使是快进模式?

2 个答案:

答案 0 :(得分:3)

Schleis' answer是正确的,但为了更深入一点,git push [remote [refspecs ...]]的“正常”(但优化)过程就是这样的。我们将你的计算机 1 / git-push-process拟人化并将其命名为“Bob”,以及所谓的遥控器“Rem”。交流是这样的:

BOB:“嗨,我有一些分支机构适合你,你有什么?”

REM:“我有masterdeploydeveloptest。”

BOB:“好的,所以我作为cabfa4e的负责人develop作为fedcafe的负责人提交test,我想发送你需要什么。“

REM:“我已经在fedcafetest了,但badf00ddevelop ...”

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,我会向您提供从badf00dcabfa4e的所有内容。”雷姆会说“不,你错过了什么(也就是说,这不是快进的。)除非你说力,否则我不会这样做。”这取决于您获取 - 和 - (合并/转换),更新Bob以获得c0ffeee(以及其他提交)。

这都是提交图。您(通过Bob)建议远程(Rem)通过将refs/heads/标签更改为指向不同的提交来更改Rem的提交图的某些部分;而你(鲍勃)提供图表的新部分,以及所需的任何其他对象;然后遥控器(Rem)根据Rem的规则(挂钩)说“OK”或“不行”。默认的内置规则是:“如果refs/heads/标签以快进方式移动,则为是。否则,如果是强制则为是,否则为否。”


1 “不要将计算机拟人化;他们讨厌这种情况。”

答案 1 :(得分:1)

git push尝试将远程存储库更新为与您正在推送的本地分支相同的状态。因此,只要历史记录兼容,该分支中的任何提交都将添加到远程。您没有推动单个提交,而是整个分支的状态。