Git rebase失去了历史,那么为什么要rebase?
过去几天我一直在寻找Git的重装。 大多数重新定义的论点都表明它清理历史并使其更加线性化。 如果你做了简单的合并(例如),你会得到一个历史记录,显示历史发生什么变化以及何时将它们合并在一起。 据我所知,重新贴牌可以消除所有的历史。 问题是:为什么你不希望回购历史记录反映代码开发的所有方式,包括它在何处以及如何分歧?
据我所知,重新贴牌可以消除所有的历史。
这是不正确的。 正如其名称所暗示的,重新设置会改变提交的基础。 通常在该进程中不会有任何提交丢失(除非您没有得到合并提交)。 虽然你关于在开发过程中保持发展过程的一切方式的观点是正确的,但这经常会导致历史混淆。
特别是当与其他人一起工作时,他们各自在自己的分支上工作,同时要求其他人的某些更改继续(例如,A要求B执行某些操作,以便A可以在自己的开发中使用该功能),这会导致许多合并。 例如像这样:
#--#--#--#--*-----*-----------------*---#--- Branch B
/ / / /
---#-----#-----#-----#-----#-----#-----#-----#-----* Branch A
在这个例子中,我们有一个分支单独工作,但不断从原始分支引入更改(#是原始提交,*是合并)。
现在,如果我们在重新合并之前在分支B上进行重新分配,我们可以得到以下结果:
#--#--#--#--#--- Branch B
/
---#---#---#---#---#---#---#---#---------------* Branch A
这代表了相同的实际更改,但B被重新定位为A上的某个较旧的提交,因此不再需要在之前完成的B上的所有合并(因为那些更改已经存在于较旧的提交中)。 现在缺少的所有提交都是合并,通常不包含有关开发过程的任何信息。 (请注意,在这个例子中,你也可以稍后重新绑定A的最后一个提交,以获得一条直线,有效地去除第二个分支的提示)
想象一下,你正在制作一个世界统治的秘密计划。 这个阴谋有三位策划人:
他们都同意在1周内到达他们的秘密基地,每个人有1个详细的计划。
作为一名实用程序员的计算机黑客建议他们使用Git来存储计划的所有文件。 每个人都会分出最初的项目回购,他们会在一周内合并所有项目。
他们都同意,在接下来的日子里,故事是这样的:
天才
他总共提交了70次提交,每天10次。
一般
他窥探同志的回购,并制定了战胜他们的战略。 最后一天他做了3次提交。
电脑黑客
这个务实的程序员使用分支。 他制定了4个不同的计划,每个计划都在一个分支上。 每个分支都被重新设计为仅仅一次提交。
七天过去了,该小组再次聚会,将所有计划合并为一个主要作品。 他们都渴望开始,所以他们都试图自己合并所有的东西。
这里讲述了这个故事:
天才
他合并了General将其所有变更,然后是Computer Hacker的变更。 然后,作为一个逻辑爱好者,他看了一下日志。 他期望看到一个想法的逻辑演变,其中的东西是根据以前的想法构建的。
但是日志显示的是在时间线上各种各样的不同想法提交。 一位读者通过阅读提交时间线无法真正理解进化和提交的推理。
所以他最后一塌糊涂,即使是一个天才也无法理解。
一般
将军认为:分而治之!
所以他在回购中合并了Genius的回购。 他看了看日志,看到了Genius想法中的一些提交,直到最后一天,这个提议都进行了一个不可思议的进程。 将军和天才的想法混合在一起的最后一天。
他在暗中监视电脑黑客并了解Rebase解决方案。 所以他对自己的想法做了重新设定,然后再次尝试合并。
现在,日志每天都显示出合乎逻辑的进展。
电脑黑客
这位务实的程序员为Genius的想法创建了一个整合分支,另一个为总体想法创建了另一个分支,并为他自己的想法创建了另一个分支。 他为每个分支做了重新分配。 然后他把所有的东西都合并在一起。
所有队友都看到他的日志很棒。 这很简单。 一见钟情是不可理解的。
如果一个想法引入了一个问题,那么引入哪个提交就很清楚了,因为只有一个。
他们结束征服全世界,并且消失了Subversion的使用。
所有人都很高兴。
你做一个rebase主要是为了在本地解决任何冲突(也就是说,在你将它推回到上游回购之前),在远程分支之上重做本地提交(你还没有推送的提交) )。
请参阅“git工作流和rebase vs合并问题”,并且相当详细:“git rebase vs git merge”。
但是rebase并不局限于这种情况,并且与“-interactive”相结合,它允许一些本地重新排序和清理历史记录。 另见“修剪GIT Checkins /压缩GIT历史”。
你为什么不希望回购历史反映代码开发的所有方式,包括它在何处以及如何分歧