git rebase和共享功能分支?

时间:2018-04-19 12:37:27

标签: git git-rebase

基于此: https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase

git rebase可以保持线性历史记录(合并“总是”导致快进)

但是,如果我想强制执行线性历史记录并要求开发人员始终在最新的上重新设置其功能分支,那么这不会导致协作/共享功能分支走出窗外吗?参见:

Don't rebase public history

是否可以使用git rebase强制执行线性历史记录,同时允许多个开发人员为同一个功能分支做出贡献?

或者git rebase意味着只能有一个功能分支的所有者?

4 个答案:

答案 0 :(得分:2)

"不要公开历史记录"是一个很好的入门规则。更全面的建议是,如果你要改变共享分支,你需要拥有副本的每个人的协议/合作。

(此时通常有人喜欢跳进去反对,有时候获得所有人的同意是不切实际的。他们试图说的是规则过于严格;但是#39;就像说光速太慢,因为我需要更快地旅行。正确的分析是肯定的,有时候你不能让所有人都参与其中;在这种情况下你不应该变形因此,简化"不要公开历史记录"如果你没有与分享分支机构的每个人合作,那么改变分支和你的尝试是不安全的。要做到这一点很容易就会被意外地撤消。但我离题了......)

所以,如果之后人们已经在分支机构进行了合作,并且你已经准备好合并它,那么你是否已经准备好合并它了每个人都会抛弃他们当地的分支副本,然后没关系 - 你们每个人都与变种人合作。

但这并不一定意味着它是一个好主意。关于rebase的营销文献喜欢将线性历史称为“更简单”,但是遗漏的是,你的闪亮的新线性历史主要是从未经过测试的代码状态(这可能会破坏错误的尝试)寻找bisect)。有些项目在保留提交拓扑方面有价值,例如他们可以回顾一个功能分支作为一个单元,而不是只需要弄清楚提交K到N恰好是一次一个功能分支。

但这一切都取决于你/你的团队。如果您认为线性历史适合您,那么是的,即使共享功能分支也可以 完成,只要您在合并后丢弃它们(其中......)为什么不是你?)。

答案 1 :(得分:1)

是的,有可能。虽然建议保持一定程度的谨慎。

使用rebase,功能分支更改将添加到主开发线。这应该在审查之后发生(在GitLab / GitHub中说:在接受合并/拉取请求之后)。因此,之前的发展不一定涉及任何早期的变革;功能分支可能已由多个开发人员共享,处理和提交。

  

不要改变公共历史

这通常意味着您不应该重新定义其他人可能基于其工作的提交(例如公共存储库的masterdevelop分支)。由于没有人应将其工作建立在已完成但尚未合并的功能分支上,因此这不适用于您的情况。

答案 2 :(得分:1)

我认为你的问题源于拥有一个中央git存储库而不是私有fork的常见工作流程。在该远程存储库中,可以从所有开发人员推送所有分支。只是因为他们可以,每个开发人员可能会觉得有能力推送和合并他们想要的任何东西。有了这样的工作流程,git rebase确实会变得危险,因为开发人员可能会删除由于意外删除已经被推送的提交而导致的提交。

如果你有这个牛仔git工作流程,那么建议开发人员使用--force-with-lease而不仅仅是--force是明智的。

我认为合作和共享功能分支走出窗口是一件好事。

在我团队的主要远程git存储库(事实的来源)中,我有一个主要的分支来防止rebase。

我推荐这些规则:

  • 总是从master派生一个功能分支,没有异常
  • 再次:永远不会派生另一个功能分支的功能分支
  • 如果您依赖另一个开发人员当前正在开发的另一个功能,请等待他们将这些更改合并到主服务器中
  • rebase您的功能分支经常针对master(包括您的依赖项,或者只是让主人保持最新状态),因为它有助于在合并冲突发生时解决
  • 可选:将你的提交压缩为一个,如果你使用git web-frontend(github,bitbucket,...)他们提供合并壁球拉取请求的功能,你可能也想使用它

创建分支的开发人员拥有分支。他们可以做任何他们想做的事情:删除,重新定位,探戈合并,在这个分支上配对编程中的其他人(其他人可能仍然在他们的分支上提交但与所有者明确表示同意并且知识)。

主要分支,例如masterdevelop是公开的。他们是圣洁的。您不会更改其历史记录,并保护它们不被删除,也不会覆盖其历史记录。如果您需要撤消主分支上的功能,则可以使用revert

答案 3 :(得分:0)

我建议您可以鼓励(而不是强制执行)线性历史记录,要求开发人员将其功能分支作为同行评审前的最后一步。

这将允许开发人员在最终重写历史记录之前进行协作,交叉合并并对该功能感到满意,以便审阅者轻松阅读。

当然,这仍然存在重塑公共历史的风险,并且可能会给那些不太熟悉这种做法的开发人员带来问题。这就是为什么我会鼓励对那些对此感到满意但又没有强制执行的人的变相。