【问题标题】:Is rebasing the best strategy to merge the branches [duplicate]正在重新调整合并分支的最佳策略[重复]
【发布时间】:2020-03-09 00:18:36
【问题描述】:

我有一个父分支和子分支。

当我想将子分支合并到父分支时,据说重新建立分支是最好的合并方式。

如果我们重新设置在另一个分支中所做的所有更改将进入当前子分支,对吗?

那么当有人想看看子分支有什么新变化时,其他分支的变化也会对。

有人可以对 Rebasing vs Pull request vs Merge 有所了解吗?

我正在尝试找到合并分支的最佳方法。

【问题讨论】:

  • “当我想将子分支合并到父分支时,据说重新建立分支是最好的合并方式” 这个,作为一个全面的声明, 具有极大的误导性。变基和合并是不同的操作,有不同的用法,没有一个能做对方的工作。
  • 我认为变基提供了良好的 git 历史线图,并具有合并的好处。合并只是合并源代码
  • 定义“一个好的 git历史”。它甚至意味着什么? 历史的唯一重要特征是真实,否则它只是一个故事,漂亮与否。

标签: git azure-devops rebase pull-request merge-request


【解决方案1】:

首先,根据我的经验,如果你的场景是团队(多人)同时开发分支。那么Rebase 就不适合了。因为如果您的一位同事执行rebase,它可以修改所有提交。同时,如果另一个人在开发这个分支,很可能找不到公共父节点,无法提交commit。

rebase 可以让历史更清晰(一行),但merge 不行。

变基 vs 拉取请求 vs 合并

  • 拉取请求

拉取请求只是用来提出一个请求来决定如何“解决”分支之间的提交。提出拉取请求后,您可以决定选择哪种合并类型的策略。


为了更好的解释RebaseMerge,这里我先设置场景:

假设您有两个分支,ma​​sterdevelopdevelop 是从 ma​​ster 在 (3. added merge.txt 文件) 提交的分支:

现在,设置 HEAD 位于 6.add hello.txt 文件,这是 master 分支的最新提交。

  • 合并

基于以上场景,执行git merge develop。下面是显示的结果:

Git 会按照两个分支的共同祖先自动进行三向合并(3.添加merge.txt文件) em>,(6.added hello.txt file)(5.added test.txt file) 两个分支的最新提交。然后根据merge中修改的内容生成一个新的commit,即commit 7。合并分支“开发”。 这就是merge的效果,简单的合并了两个分支,生成了一个新的提交。

  • 变基:

另外,基于上述场景,执行git rebase develop。下面是显示的结果:

可以看到develop分支和fork都消失了。

在执行rebase操作时,git会从当前分支(master)中提取出changes(6.added hello.txt file),而这个变化是start从两个分支(3.added merge.txt file)的共同祖先开始的.

然后让master分支指向目标分支develop最新的commit(5.added test.txt file)。并将刚才提取的更改应用于此最新提交。

如果提取有多个更改,则 git 将依次应用于最新的提交。如下图,左边是初始状态,右边是rebase执行后的状态:

一句话,git rebase 提取操作有点像git cherry-pick(只是相似,但不一样)。 rebase 执行后,会依次cherry-pick当前提交,然后发送到目标分支。之后,原始分支上提取的提交被删除。


总结:

可以看到merge的结果可以反映时间线,但是rebase会打乱时间线。两者都可以实现代码组合,只针对公共分支,如ma​​ster,不建议使用Rebase

另外,merge 的麻烦在于回滚提交节点。但是因为 rebase 是在 rebase 完成之后,你将不知道你从哪里拉出了开发分支,这就是我所说的破坏历史时间线。

【讨论】:

  • 对于一个更大的 6 人团队来说,合并两个分支的首选方式是什么.... 合并还是变基?
  • @DanRam,合并更好。这样可以保留一个非常完整的历史记录,有利于团队领导检查。
  • 感谢您的宝贵反馈 :) 我很感激。如果您不介意,为什么 merge 比 rebase 更好?我不理解“有利于团队负责人检查的已完成历史记录”一词,您的意思是团队负责人无法检查已完成的历史记录,如果它被重新设置?我认为即使在 rebase 中,我们也会得到一条 git 历史行,对吗?给队长看?我在某处读到,如果我们重新设置它可能会影响其他人所做的提交,因为它会改变......所以这是否意味着合并不会影响那些以前的提交?
  • 到目前为止,我们还没有完成任何变​​基,并且该项目仅使用 Merge 运行,但现在转向变基会是一个坏主意吗?它可以改变以前的提交吗?与合并命令相比,rebase 有什么优势吗?
  • @DanRam 您可以参考我在回答中分享的图片。如果我是团队负责人,我想清楚地知道关于这个 repos 的完整历史。 Merge 可以让我知道“哦,在节点 7,有人从 master 创建了一个分支并在该功能分支中进行了 3 次提交。然后将它们合并回节点 10”,参见第二张图片。是的,rebase 也可以让我知道完整的历史记录。 但是,它带来的麻烦是我永远不会知道这个 repos 上发生了什么。我只知道“哦,这里有提交”。不知道是不是很容易理解,我觉得还是有图说话比较好。
【解决方案2】:

我的建议是获得使用 rebasingmerging 的经验。然后你就会知道什么最适合你。它还取决于有多少人在从事该项目以及他们的 git 知识。如果他们没有 git 经验,通常合并是最好的选择。

我个人更喜欢变基并保持存储库历史干净。

而且,拉取请求是一种向项目提交贡献的方法,它与上面提到的完全不同。

【讨论】:

  • 嗨,拉取请求与 Merge 或 rebase 有何不同?无需执行任何合并或变基请求...我可以使用拉取请求合并两个分支。你能解释一下吗
  • 有 6 个人在做这个项目。对于像这样的更大的团队来说,rebase 不是更可取的。如果是或否,请您解释一下原因
  • @DanRam,6 人是一个小团队,可以轻松地采用变基策略。至于拉取请求,这只是一种将代码与审查合并的机制,在幕后它是一个简单的合并。 (同样,您可以重新设置分支并创建拉取请求,不知道如何解释,只需使用您自己的存储库尝试)
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2011-08-08
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多