git rebase-为什么需要解决多个差异

git rebase-为什么需要解决多个差异,git,git-rebase,Git,Git Rebase,我已经多次使用git rebase,但我仍然对它的实际工作方式感到困惑 使用git merge看起来很简单——解决分支尖端和另一个分支尖端之间的差异 然而,使用git rebase时,我们经常在执行rebase时解决多个差异。我相信已解决差异的数量是“我的分支有多少次提交,而另一个分支没有”对吗?但是为什么仍然需要解决所有的差异,为什么不只是我分支上最近提交的差异 或者,执行git rebase可能意味着解决“我的分支没有的来自另一个分支的所有提交”的所有差异!我还没弄清楚哪个是哪个。有人能解释

我已经多次使用git rebase,但我仍然对它的实际工作方式感到困惑

使用git merge看起来很简单——解决分支尖端和另一个分支尖端之间的差异

然而,使用git rebase时,我们经常在执行rebase时解决多个差异。我相信已解决差异的数量是“我的分支有多少次提交,而另一个分支没有”对吗?但是为什么仍然需要解决所有的差异,为什么不只是我分支上最近提交的差异


或者,执行git rebase可能意味着解决“我的分支没有的来自另一个分支的所有提交”的所有差异!我还没弄清楚哪个是哪个。有人能解释一下这是如何工作的吗?

重基是将一系列修补程序从提交层次结构中的一个位置移动到层次结构中另一个位置的请求。它就像一系列的“樱桃采摘”(是的,确实如此;-)

因此,首先需要确定要移动的提交的正确列表,并将其视为补丁。当心对某些修订范围选项的误解(有些不起作用,他们甚至没有说出你的想法)。当心你的“上游”-它可能不是你所想的,所以Git可能认为补丁已经应用于“上游”

在获得了一系列补丁(提交范围)之后,这些补丁需要一个接一个地应用到新的目标。您这样做是因为它是一个更好的地方,并且通常已经应用了一些修复

应用第一个补丁(diff)时,出现了一些小冲突,比如在编辑公式时,新的(“上游”)位置重命名了一个变量。这将是一个冲突(对同一位置或相邻线的两个更改)。因此,您修复了第一个补丁冲突

现在第二个补丁碰到了同样的尴尬点。这是一个愚蠢的差异。它不知道足够的重命名和行修复,因此无法找到正确的确切起点,所以您必须再次解决它。提示第三个补丁,同样类型的问题再次出现

如果您的提交不是原子性的(即每个提交都非常小!),这尤其糟糕。并且没有语义(重命名等)的变化

因此,如果您有一个快速的上游(即跟上),或者偶尔做一次(即做一次大的修复会话),那么经常重新设置基础

此外,请使用“重新阅读”功能。这是Git的“重用记录解析”功能。您需要启用它。它将记住您的每个“修复”,然后如果需要再次修复,它可以重用它。因此,您可以练习修复,忘记不好的修复,然后重新运行rebase(临时尝试使用--ON选项)


Reerre文档不是很好,但是有一些web文章。

git rebase
是关于在master的顶部保持一个干净的历史记录。许多项目,例如linux内核,都在主题分支中工作,其中每个区域/主题/驱动程序在合并到master之前都位于master之上自己的分支中

在大多数情况下,我们并不关心开发人员在提交补丁系列之前经历的多次迭代。e、 g.我们不需要知道开发是在什么父提交的基础上开始的,master被合并回分支的次数,对原始提交做了什么修改,等等。从数学的角度来说,我们想要的是一个干净的最终解决方案,而不是获得最终解决方案的所有方法

我们所需要的只是在master上有一组干净的提交<代码>git rebase对于这一点至关重要。它总是将您的更改保持在master的顶部,而不是一系列混乱的合并和修复。这意味着,在重新基址期间,您必须在将每个提交应用到master(已向前移动)之上时对其进行修复,就像提交是在这个版本的master之上生成的一样


注意,有些项目更喜欢对开发人员来说本质上是私有的主题分支进行重基,但公共的主分支总是使用merge。

大多数情况下都是这样的-那么,如果不是为了虚荣,git重基的目的是什么呢?@rakim让我们从另一端开始,git是一种记录软件版本、缺点和所有问题的方法,没有任何管理限制。当你想展示你最好的作品时,你需要“整理”所有的糟粕,选择最好的部分(使用rebase interactive进行调整),然后展示一个x10开发人员的美好历史。或者你只是忘记了你应该建立在哪个分支上;-)。这不是虚荣,而是成为一名专业人士(TM)(在时间允许的情况下)。但主要使用it/git来记录您的工作,以帮助您。也就是说,您可以在对侧线程/分支进行审阅和抛光时重新设置其基础。“主控顶部”是一种本地代码选择。另一个原因(对于rebase)可能是,有一个严重的错误不应该在您的本地回购(即先考虑再推动的考虑)同意之后发布,这就是在我的情况下rebase的主要用途——因为它在内核特性的后续版本中得到了审查和完善。不过我注意到,合并在大多数其他项目中非常普遍,而且rebase被恶意攻击到从未使用过的程度。喜欢你在回复OPs时的评论。