Git Merge和Git Rebase简介:为什么以及何时使用它们

通常,开发人员可以在“合并”(merge)和“重建基准”(rebase)(重定位)之间进行选择。 在Google中您会看到不同的意见,建议许多人不要使用Rebase,因为这可能会导致严重的问题。 在本文中,我将解释什么是合并和移动,为什么要(或不应该)使用它们以及如何做到这一点。

图片

Git Merge和Git Rebase拥有相同的目标。 它们旨在集成从一个分支到另一个分支的更改。 尽管最终目标是相同的,但操作原理却不同。

有些人认为您应该始终使用Rebase;其他人则喜欢Merge。 这有其优点和缺点。

Git合并


对于使用版本控制系统的开发人员而言,合并是一种常见做法。 无论创建分支是为了测试,错误修复还是出于其他原因,合并都会在其他地方捕获更改。 合并将获取源分支的内容,并将其与目标分支合并。 在此过程中,仅目标分支被更改。 源分支的历史记录保持不变。
图片
优点:

  • 简单
  • 保留完整的历史记录和时间顺序;
  • 维护分支上下文。

缺点:

  • 提交的历史记录可以用很多提交来填充(污染);
  • 使用git bisect进行调试可能会更加棘手。

怎么做

使用checkoutmerge命令将master分支合并到feature分支。

$ git checkout feature $ git merge master (or) $ git merge master feature 

这将在功能分支中创建一个新的“合并提交”,其中包含两个分支的历史记录。

git rebase


变基是将更改从一个分支推送到另一个分支的另一种方法。 Rebase将所有更改压缩到单个补丁中。 然后将补丁集成到目标分支中。

与合并不同,移动会覆盖历史记录,因为它会将完成的工作从一个分支转移到另一个分支。 该过程消除了不需要的故事。

图片

优点:

  • 简化一个可能复杂的故事
  • 一次提交即可简化操作
  • 避免在繁忙的存储库和分支中合并提交
  • 清理中间提交,使它们成为单个提交,这对于DevOps命令很有用

缺点:

  • 将功能压缩到几次提交可能会隐藏上下文
  • 在团队中工作时,移动公共存储库可能很危险
  • 出现更多工作
  • 若要使用已删除的分支进行恢复,则需要进行推送。 这导致本地和远程具有相同名称的所有分支的更新,这很糟糕。

如果您错误地采取了行动,那么故事将会改变,这可能会导致严重的问题,因此请确保您做到了!

怎么做

使用以下命令将Feature分支移至main分支。

 $ git checkout feature $ git rebase master 

这会将整个功能分支移至主分支。 项目的历史记录正在更改,将在主分支中为每个提交创建新的提交。

互动运动


这允许您在将提交移动到新分支时更改提交。 这比自动移动更好,因为它可以完全控制提交的历史记录。 通常用于在合并功能分支到母版之前清除历史记录。

 $ git checkout feature $ git rebase -i master 

这将打开编辑器,列出所有将被移动的提交。

 pick 22d6d7c Commit message#1 pick 44e8a9b Commit message#2 pick 79f1d2h Commit message#3 

这将确定分支在移动后的外观。 通过布置对象,可以根据需要制作故事。 您可以使用fixupsquashedit等命令。

图片

使用哪一个?


那有什么更好的呢? 专家推荐什么?

由于所有团队都不相同,因此很难就哪个更好使用做出唯一正确的决定。 这完全取决于团队的需求和传统。

根据Git的团队能力做出决定。 简单性或重写历史记录对您来说很重要,还是其他?

我有什么建议?

随着团队的成长,使用合并管理或跟踪开发变更变得越来越困难。 为了获得清晰可理解的提交历史记录,使用Rebase是明智的。

变基的好处:

  • 您在本地发展:如果您尚未与其他人共享您的工作。 现在,您应该更喜欢合并以使故事井井有条。 如果您有一个不与其他开发人员共享的个人存储库分支,则即使移至分支机构也可以重新设置基础。
  • 您的代码已准备好进行检查:您已创建拉取请求。 其他人会分析您的工作,并可能将其插入本地进行审查。 目前,您不应该移动工作。 您必须创建“重做”提交并更新分支。 这有助于跟踪请求请求,并防止意外中断故事。
  • 审查已完成,可以集成到目标分支中。 恭喜你! 您将要删除功能分支。 鉴于从现在开始,其他开发人员将不会提取并合并这些更改,这是您改变故事的机会。 此时,您可以重写历史记录并重置原始提交,这些烦人的“变更”和“合并”合并为一小组目标提交。 为这些提交创建显式合并是可选的,但这很重要。 它记录功能何时达到主状态。

现在您知道了,尽管微不足道,但是Merge和Rebase之间的区别。 我相信您会做出正确的决定,并会使用适合您的东西。

不要忘记:

 code = coffee + developer 

Source: https://habr.com/ru/post/zh-CN432420/


All Articles