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
不在乎。
如果这是项目贡献指南的强制要求,尽管可能有实际原因,例如历史可视化工具往往会遇到许多分支相互重叠的问题,这是一种避免分支重叠的方法,因为一个分支基本上总是跨越两个提交。
如果我强制执行此操作,我会添加工具来自动执行此操作(“合并机器人”的某些变体或模式)。
我是新来的,只是想知道 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
不在乎。
如果这是项目贡献指南的强制要求,尽管可能有实际原因,例如历史可视化工具往往会遇到许多分支相互重叠的问题,这是一种避免分支重叠的方法,因为一个分支基本上总是跨越两个提交。
如果我强制执行此操作,我会添加工具来自动执行此操作(“合并机器人”的某些变体或模式)。