Git 以智能方式合并

Git merging in intelligent way

我是新来的,只是想知道 git。

最近,我有机会处理一个巨大的存储库。 (我相信它也可以在全球 git 历史上排名如此之大) 回购平均每分钟 3-5 次提交。(这里不是开玩笑)

让我们回到问题上来,

由于 repo 很大,我们维护基于 PR 的合并意义,没有人可以直接提交预定义的 5 个分支。当我们尝试在开发分支上提交时,我们需要创建一个自定义功能分支,并且它经常不同步,以避免在开发时我们首先推送空分支。在本地导致以下情况。

Mainline branch 

a--b--c--d--e--f--g--h      --i--j
                       -1--2 (custom/feature branch)

所以在给定的情况下,我希望我的分支(custom/feature 分支)像

a--b--c--d--e--f--g--h--k--l--1--2

我知道一种实现此目的的方法,我们在自定义分支上执行以下操作

git reset --hard~2
git pull origin Mainline --ff-only
git reflog | grep "commit"
git cherry-pick ######1
git cherry-pick ######2

给定的方法确保我没有丢失任何提交,并且我的分支与主线分支同步,没有任何合并提交。

所以这里的问题是“为所有 commits/branches 做这件事一直很忙,所以我们有什么办法可以通过 1-2 个命令完成它吗?”

我也对 git 的行为感到困惑,因为我们使用的是 bitbucket 网络界面,它会在将自定义分支合并到主线分支时在 PR 部分发生冲突时向我们显示。

所以这里的疑惑是,自定义分支有必要保持更新吗? (由于我们正在使用递归策略进行合并,所以我认为这不是绝对必要的。)

So the question here is "It's been hectic to do this for all the commits/branches, so is there any way we can have it done through 1-2 commands?"

$ git fetch origin Mainline
$ git rebase origin/Mainline

请注意,这不会更新“本地”Mainline,但如果您不应该直接在其中工作,您不妨删除它,只保留远程。

如果您有多个有用的分支,您可能希望省略分支名称并将 -p (--prune) 添加到 fetch,例如

$ git fetch -p origin

这将更新所有分支跟踪origin,并自动删除(修剪)已删除的分支。

如果您有多个遥控器,您可能需要将 origin 替换为 --all,并在同一命令中保留 -p--all 将遍历每个遥控器远程更新他们所有的分支。

git pull --rebase origin Mainline 应该也可以,但我不喜欢 git pull,我宁愿分别明确地执行“与远程同步”和“更新本地分支”步骤。

贡献者文档或培训没有将其作为示例工作流程提供,这让我感到有些惊讶。

So the doubt here is that, is it necessary to keep the custom branch updated? (as we are using recursive strategy for merging I don't feel it is absolutely necessary.)

技术上?不,git 不在乎。

如果这是项目贡献指南的强制要求,尽管可能有实际原因,例如历史可视化工具往往会遇到许多分支相互重叠的问题,这是一种避免分支重叠的方法,因为一个分支基本上总是跨越两个提交。

如果我强制执行此操作,我会添加工具来自动执行此操作(“合并机器人”的某些变体或模式)。