我为什么要做git rebase?

我为什么要做git rebase?,git,git-rebase,Git,Git Rebase,我看到很多人谈论git rebase及其功能,例如,人们谈论它实现了什么(给出了线性历史),例如,在这里,但我不明白你为什么要这么做 返回并修改您的提交历史记录(这肯定会涉及一些与n路冲突的丑陋合并),这似乎是一笔巨大的开销。我可以想象这样的情况可能会产生误导(例如,如果两个人以不同的方式解决同一个问题,但历史并没有显示他们的工作是并行的;在某些高压编码环境中,这似乎也很容易导致批评和不满) 您得到的是一个更容易理解但不正确的历史图表。是什么让这些努力值得 提前感谢。在短时间内(数小时或数分钟)

我看到很多人谈论git rebase及其功能,例如,人们谈论它实现了什么(给出了线性历史),例如,在这里,但我不明白你为什么要这么做

返回并修改您的提交历史记录(这肯定会涉及一些与n路冲突的丑陋合并),这似乎是一笔巨大的开销。我可以想象这样的情况可能会产生误导(例如,如果两个人以不同的方式解决同一个问题,但历史并没有显示他们的工作是并行的;在某些高压编码环境中,这似乎也很容易导致批评和不满)

您得到的是一个更容易理解但不正确的历史图表。是什么让这些努力值得


提前感谢。

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

在推送到共享服务器之前,必须首先拉送对源服务器头部所做的提交,同时,如果不这样做,将创建非快进推送。在执行此操作时,可以在合并(
git pull
)或rebase(
git pull--rebase
)操作之间进行选择。合并选项虽然在技术上更具吸引力,但会创建一个额外的合并提交。对于较小的提交,每次更改出现两次提交实际上会降低历史的可读性,因为合并操作会分散提交消息的注意力

在一个典型的共享开发树中,每个开发人员都通过执行
git pull;git推送
。如果他们使用的是
git pull
,而没有
--rebase
,那么发生的情况是,几乎每次提交都会伴随着合并提交,即使没有真正进行并行开发。这创造了一个相互交织的历史,实际上是一个线性的提交序列。出于这个原因,
git pull--rebase
对于因开发时间短而导致的小更改是一个更好的选择,而合并是为集成长期存在的特性分支而保留的


所有这些都适用于重定本地提交的基调,或者重定密切相关的同事(坐在同一个房间)共享的短期功能分支的基调。一旦提交被推送到一个分支,然后其他分支定期跟进,就应该永远不会对其重新设置基础。

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

与大多数与git相关的事情一样,只有知道自己在做什么以及为什么要做,才应该重新设置基址。以下是我重新定基的一些原因:

  • 我曾经做过一个补丁系列,在这期间没有涉及到任何上游修改过的组件。在这种情况下,合并提交不会包含任何有用的信息
  • 我将在上提交一个pull请求,而所需的合并提交将是大量工作。通过首先重定基址,我使上游所有者更容易处理拉请求。当然,我可以合并,但因为他们以前从未见过我的代码,这只会使补丁系列更难阅读
  • 我正在合并来自上游的更改,并且存在大量冲突
    git rebase
    允许我在提交时一次性解决这些冲突,使其更易于理解,并在执行时进行测试。如果我关心维护合并提交,我可以在之后返回到分支的非重定版本,将其与上游合并,然后使用重定版本的差异作为冲突解决合并提交

TLDR:再基地战略不值得努力。

再基地战略的唯一好处是线性历史,仅此而已

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

我的答案几乎是肯定的,合并策略不是很好,但已经足够好了

但这就是重新调整战略的成本:

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

我已经尝试了这两种方法,当我将收益与劣势进行比较时,重定基础策略不值得一试。

好问题-就我个人而言,我避免重定基础,原因正是你提到的。我想这是个人偏好的问题,但我也更喜欢历史图表显示真实情况;在我心目中,rebase的唯一用途就是它。我不明白为什么有些项目在历史上完全不允许合并。不允许合并听起来像是对答案中描述的大量虚假合并的下意识反应。这是一个错误的反应,但在看到同事(包括我自己)立即创建的承诺图后,我有点理解了