Git智能合并

n6lpvg4x  于 2023-05-05  发布在  Git
关注(0)|答案(2)|浏览(151)

我是新来的,只是在这里闲逛。
最近,我有机会在一个巨大的存储库上工作。(我相信它可以在全球git历史上排名,以及是巨大的)仓库是有平均每分钟3-5提交。(这里没有开玩笑)
让我们回到问题上来,
由于repo是巨大的,我们维护了基于PR的合并含义,没有人可以直接提交预定义的5个分支。当我们尝试在develop分支上提交时,我们需要创建一个自定义特性分支,并且它经常不同步,以便在开发时避免我们首先推送空分支。导致本地出现以下情况。

Mainline branch 

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

因此在给定情况下,我希望我的分支(自定义/特性分支)如下所示

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

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

所以这里的问题是“为所有的提交/分支做这件事已经很忙了,所以我们有没有办法通过1-2个命令来完成它?“

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

所以这里的疑问是,是否有必要保持自定义分支的更新?(因为我们使用递归策略进行合并,所以我觉得这不是绝对必要的。)

f4t66c6m

f4t66c6m1#

所以这里的问题是“对所有的提交/分支都这样做是很忙的,所以我们有没有办法通过1-2个命令来完成它?“

$ git fetch origin Mainline
$ git rebase origin/Mainline

请注意,这将不会更新“本地”主线,但如果你不应该直接在它工作,你不妨删除它,只保留远程。
如果你有多个有用的分支,你可能想把分支名去掉,把-p--prune)加到fetch上,例如:

$ git fetch -p origin

这将更新所有跟踪origin的分支,并将自动删除(修剪)已删除的分支。
如果您有多个远程控制器,您可能希望在同一命令中将origin替换为--all,保留-p--all将遍历每个远程并更新其所有分支。
git pull --rebase origin Mainline也应该可以工作,但我不喜欢git pull,我宁愿单独和明确地执行“与远程同步”和“更新本地分支”步骤。
我有点惊讶的是,贡献者文档或培训中没有将其作为示例工作流提供。
所以这里的疑问是,是否有必要保持自定义分支的更新?(因为我们使用递归策略进行合并,所以我觉得这不是绝对必要的。)
严格来说git不在乎。
如果这是由项目的贡献指导方针强制要求的,尽管可能有实际的原因。历史可视化工具往往会遇到许多分支彼此重叠的问题,这是一种避免分支重叠的方法,因为分支基本上总是跨越两个提交。
如果我强制这样做,我会添加工具来自动完成(“合并机器人”的一些变体或模式)。

b1zrtrql

b1zrtrql2#

Masklinn已经解释过上游的git-rebase(1)是你想要的。TTT提到了semi-linear merges
因为这个仓库有很多提交,所以遵循半线性合并策略可能会很忙,特别是如果你要求在合并之前通过一些CI。为了缓解这种情况,您可以通过从开发分支创建一个集成分支,在其上重定几个特性分支的基,执行CI运行(如果需要),然后在集成分支中合并到开发分支中,来批量处理建议的合并。您可以在合并提交消息中提及您合并的特性或它们的拉取请求。
你可以做同样的事情,但是合并到集成分支,然后最后合并到开发分支,但是这会创建两个级别的合并,如果你遵循半线性合并策略,这可能不是你想要的(我不知道)。

相关问题