【问题标题】:Why would I want to do git rebase?为什么我想做 git rebase?
【发布时间】:2012-10-23 00:38:42
【问题描述】:

我看到很多人谈论 git rebase 以及它的作用,例如Hg: How to do a rebase like git's rebase 人们谈论它所取得的成就(给出线性历史),例如这里Git rebase loses history, then why rebase? 但我不明白你为什么要这样做。

返回并修改您的提交历史似乎是一项费用(这肯定涉及一些丑陋的合并与 n 路冲突)。而且我可以想象它可能会非常误导的情况,(例如,如果两个人以不同的方式解决同一个问题,但历史并没有显示他们的工作是并行发生的;似乎也很容易引起批评和怨恨在一些高压编码环境中)。

您获得的是更容易理解但不正确的历史图表。是什么让这值得付出努力?

提前致谢。

【问题讨论】:

  • 好问题 - 我个人避免变基,因为你提到的确切原因。我想这是个人喜好问题,但我也更喜欢历史图表显示实际发生的情况。

标签: git git-rebase


【解决方案1】:

在推送单个提交或在短时间内(小时或分钟)开发的少量提交时,Rebase 最有用。

在推送到共享服务器之前,必须先将同时提交到源的 HEAD 的提交拉取——否则会创建非快进推送。这样做时,可以在合并 (git pull) 或变基 (git pull --rebase) 操作之间进行选择。合并选项虽然在技术上更具吸引力,但会创建额外的合并提交。对于小型提交,每次更改出现两次提交实际上使历史记录不太可读,因为合并操作分散了提交消息的注意力。

在典型的共享开发树中,每个开发人员最终都会通过执行git pull; <resolve conflicts>; git push 的一些变体来推送到共享分支。如果他们使用git pull 而不使用--rebase,那么几乎每个 提交最终都伴随着一个合并提交,即使没有真正进行并行开发。这从实际上是线性提交序列中创建了一个相互交织的历史。出于这个原因,git pull --rebase 对于短期开发导致的小更改是一个更好的选择,而合并则保留用于集成长期存在的功能分支。

所有这些都适用于变基 本地 提交,或变基由紧密联系的同事(坐在同一个房间)共享的短期功能分支。一旦提交被定期推送到其他分支,它应该永远被重新设置。

【讨论】:

  • 完全同意;在 my 头脑中唯一使用 rebase 的就是那个。我不明白为什么有些项目在他们的历史中完全不允许合并。
  • 禁止合并听起来像是对答案中描述的大量虚假合并的下意识反应。这是错误的反应,但在看到我的同事(包括我自己)在几年前开始使用 git 后立即创建的提交图后,我有点理解它——它看起来更像是一块印刷电路板,而不是提交的历史。
  • 任何禁止合并的人可能还没有了解git log --no-merges
  • git log --no-merges 很好,但您确实希望看到tiggitk 等工具中的合并。在我的团队中,我们禁止了 trivial 合并,即合并单个小提交的合并。 (而且禁令是以一种纯粹的、ahem、社交的方式执行的。)
  • @user4815162342 正是我的想法
【解决方案2】:

执行变基通常不涉及比合并更多的冲突解决,因此与之相比的费用是最小的(实际上只是重放提交所需的时间)。

与大多数与 git 相关的事情一样,只有在知道 什么 你在做什么以及 为什么 你要这样做的情况下,你才应该重新设置基准。以下是我进行 rebase 的一些原因:

  • 我已经处理了一个补丁系列,它没有触及任何同时在上游更改的组件。在这种情况下,合并提交不会包含任何有用的信息。
  • 我即将在GitHub 上提交拉取请求,而所需的合并提交将是很多工作。通过首先变基,我使上游所有者更容易处理拉取请求。当然我可以合并,但由于他们以前从未见过我的代码,这只会使补丁系列更难阅读。
  • 我正在从上游合并更改,并且存在大量冲突。 git rebase 让我在提交时一次解决这些冲突,使其更容易理解,并在我进行时进行测试。如果我关心维护合并提交,我可以在之后返回到分支的非重新定位版本,将其与上游合并,然后使用针对重新定位版本的差异作为冲突解决合并提交。

【讨论】:

  • “因此与此相比的费用是最小的”我的经验是,这是开发工作中可见的费用,如果你真的从线性历史中受益,你应该问自己两次。
【解决方案3】:

TLDR:rebase 策略不值得努力。

变基策略的唯一好处是线性历史,仅此而已。

现在问自己一个问题,你检查了多少次 git 历史以找出一些东西?你能用合并策略解决它吗?

我的回答几乎是从不,是的,合并策略不是很好,但已经足够好了。

但这是变基策略的成本

  • 每次其他人将更改推送到主分支时,您都必须重新调整您的更改,这对 3 个开发人员来说很好,但对于更多开发人员来说,这会成为一个问题,添加到它等待管道构建,这会变得很恐怖合并任何东西。
  • 您一次只能将一个更改“合并”到主分支,所有其他更改必须首先重新设置基础并再次通过管道构建(额外延迟)。
  • 必须为每个提交单独解决冲突,如果我知道我在下一次提交中更改了它,那么为旧的/过时的提交解决冲突对我来说是疯狂的。
  • 如果你搞砸了 rebase,你会将所有的修复添加到最后一次提交中,而所有旧的修复都会被破坏。另一种方法是重新开始。
  • 你必须在 rebase 后强制推送到你的分支,如果你搞砸了,你可能会花很长时间扫描 reflog。
  • 如果您的分支上有两个以上的提交,您可能会在 rebase 之前压缩它们以减少工作量,并且您会丢失宝贵的提交历史记录。

我都尝试过,当我比较利弊时,Rebase 策略不值得努力。

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 2018-05-27
    • 1970-01-01
    • 2016-10-27
    • 2021-06-06
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多