我见过很多人都在谈论 git rebase
它做了什么,例如 Hg:如何像git的rebase那样做一个rebase 并且人们谈论它实现了什么(给出线性历史),例如这里 Git rebase失去历史,然后为什么会变质? 但我无法理解你为什么要这样做。
这似乎是一个 大 费用,返回并修改你的提交历史(肯定会涉及与n路冲突的一些丑陋的合并)。我可以想象它可能会产生误导的情况(例如,如果两个人以不同的方式解决同样的问题,但历史并没有表明他们的工作是平行发生的;似乎很容易导致批评和怨恨在一些高压编码环境中)。
您获得的是一个更容易理解但不正确的历史图表。是什么值得努力?
提前致谢。
在短时间内(小时或分钟)推送单个提交或少量提交时,Rebase最有用。
在推送到共享服务器之前,必须首先同时提取对原始HEAD的提交 - 否则将创建非快进推送。这样做,可以选择合并(git pull
)或一个rebase(git pull --rebase
)操作。合并选项虽然在技术上更具吸引力,但会创建一个额外的合并提交。对于小型提交,每次更改两次提交的外观实际上构成了历史记录 减 可读,因为合并操作会分散提交的消息。
在典型的共享开发树中,每个开发人员都会通过执行某些变体来推送到共享分支 git pull; <resolve conflicts>; git push
。如果他们正在使用 git pull
无 --rebase
几乎就是这样 一切 即使没有并行开发真正进行,提交最终会伴随合并提交。这从实际上是线性的提交序列创建了一个交织在一起的历史。出于这样的原因, git pull --rebase
对于因短期开发而导致的小变化,这是一个更好的选择,而合并则保留用于长期特征分支的集成。
这一切都适用于变基 本地 承诺或重新安排由密切相关的同事(坐在同一个房间)共享的短命功能分支。一旦提交被定期推送到分支机构,然后是其他人,它就应该 决不 重新定位。
执行rebase通常不会涉及比合并更多的冲突解决方案,因此与此相比的费用是最小的(实际上只是重播提交所花费的时间)。
与大多数与git相关的事情一样,如果你知道,你应该只改变 什么 你正在做,而且 为什么 你在做以下是我进行变基的一些原因:
- 我已经开发了一个补丁系列,它没有触及任何在上游被改变的组件。在这种情况下,合并提交不包含任何有用的信息。
- 我即将提交拉取请求 GitHub上,并且需要合并提交将是很多工作。通过首先进行变基,我使上拉所有者更容易处理拉取请求。当然我可以合并,但因为他们以前从未见过我的代码,这只会让补丁系列难以阅读。
- 我正在合并来自上游的变化,并且存在大量冲突。
git rebase
让我一次解决提交中的这些冲突,让我更容易理解,并随时测试。如果我关心维护合并提交,我可以稍后回到分支的非重定版版本,将其与上游合并,然后在针对合并提交的冲突解析时使用针对重定版版本的diff。