【问题标题】:What are the advantages of a rebase over a merge in git?与 git 中的合并相比,rebase 有什么优势?
【发布时间】:2011-02-22 00:27:21
【问题描述】:

this article,作者用这张图解释了变基:

变基:如果你还没有发布你的 分公司,或已明确沟通 其他人不应以他们的工作为基础 在它上面,你有一个选择。你 可以变基你的分支,而不是 合并时,您的提交被替换为 另一个不同的提交 父级,并且您的分支已移动 在那里。

虽然正常的合并看起来像这样:

所以,如果你rebase,你只是失去了一个历史状态(这将在未来的某个时候被垃圾收集)。 那么,为什么有人想要做一个变基?我在这里错过了什么?

【问题讨论】:

  • 图片不工作

标签: algorithm git version-control dvcs


【解决方案1】:

变基允许您以正确的顺序获取合并。合并背后的理论意味着您不必担心这一点。如果您重新设置基准,然后按顺序合并新的更改,解决复杂冲突的现实会变得更容易。

您可能想阅读Bunny Hopping

【讨论】:

  • 根据我的经验,这不是真的。当您使用 rebase 时,以后合并可能会更容易,但 现在 这是一场噩梦,因为在单个 rebase 中会出现多个冲突。通常来自同一个文件。切换到直接合并使每个人的短期和长期合并变得更加简单。
  • 在 rebase 中不会出现冲突,因为您不会对冲突的提交进行 rebase。
【解决方案2】:

在多种情况下,您可能需要变基。

  • 您在不同的分支上开发了一个功能的几个部分,然后意识到它们实际上是想法的线性发展。将它们重新设置为该配置。

  • 您从错误的地方分叉了一个主题。也许太早了(你需要以后的东西),也许太晚了(它实际上也适用于以前的版本)。将其移动到正确的位置。 “为时已晚”的情况实际上无法通过合并来解决,因此 rebase 至关重要。

  • 您想测试一个分支与另一个分支的交互,但由于某种原因不想合并。例如,您可能想查看逐个提交而不是一次全部出现的冲突。

这里的一般主题是过度合并会使历史变得混乱,如果您一开始没有正确制定分支/合并计划,则重新设置基准是一种避免这种情况的方法。太多的合并会使人类难以跟踪历史,也可能使使用 git-bisect 之类的工具变得更加困难。

还有很多情况会提示交互式变基:

  • 多次提交应该是一次提交。

  • 一次提交(不是当前一次)应该是多次提交。

  • 提交(不是当前提交)或其消息中有错误。

  • 应删除提交(不是当前提交)。

  • 应重新排序提交(例如,以更合乎逻辑的方式进行)。

虽然您在做这些事情时确实“失去了历史”,但现实情况是您只想发布干净的作品。如果某些内容仍未发布,则可以对其进行变基以将其转换为您应该提交它的方式。这意味着公共存储库中的最终版本将合乎逻辑且易于遵循,不会保留开发人员在此过程中遇到的任何问题。

【讨论】:

  • 该死的:今天不再支持。我要补充:stackoverflow.com/questions/1241720/…stackoverflow.com/questions/457927/…stackoverflow.com/questions/1751534/…(供 Linus 评论)
  • 我还要顺便提一下:utcc.utoronto.ca/~cks/space/blog/tech/GitNewHistory:“git 的设计意味着,就其本质而言,你无法重写历史”
  • @VonC:与往常一样,您对先前问题的研究向我展示了这一点。感谢您的链接。 “改写历史”这一点也很好。对其他人来说:总结是你实际上并没有重写,你创建了新的历史并更新了 ref 以指向它而不是旧的历史。这里也有很多关于这类事情的问题——通过重新定位/修改来寻找你“丢失”的历史。
  • “你创建新的历史并更新 ref 以指向它而不是旧的历史”:是的!确切地。更多的 reflog 和git log -g ;)
猜你喜欢
  • 2016-07-04
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2010-10-20
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多