git - Git rebase 从一个父提交到一个新父提交之上(没有旧父提交作为其父提交之一)
问题描述
编辑:我们正在使用 Gerrit。本地更改被转移到 Gerrit,在那里进行审查,然后(由 Gerrit)合并到远程 master 分支。
现在我多次遇到一个特定的变基问题,超出了我对 Git 功能的有限理解。想象一下下面的场景(虽然这一切都在发生,但没有其他活动发生origin/master
):
您创建一个A
直接基于当前内容的新提交origin/master
。在A
合并到之前origin/master
,您已经创建了一个B
直接基于 commit的新提交A
。
现在,在提交A
审核期间,决定将提交A
拆分为两个单独的提交。因此,您创建一个新的提交A0
,该提交直接基于origin/master
并将部分更改移动A
到新创建的A0
. 现在A0
被合并,成为新的origin/master
. 接下来,原来的A
(现在更苗条了,因为它不再包含移动到的东西A0
)基于顶部A0
(即顶部origin/master
)重新建立,然后合并到origin/master
. 到现在为止还挺好。
接下来(准备合并B
到origin/master
)您尝试B
在origin/master
. 这就是一切都大错特错的地方(无论如何,对我来说)。
当我运行这些步骤(在 Git bash 中)时,我通常会重新调整更改:
- git fetch --prune
- git rebase 起源/主
Git 抱怨说有一个必须手动解决的冲突。就我而言,这是一个 changelog.txt 文件。在B
的原始历史记录中,此 changelog.txt 文件包含一个合并的更改日志条目,用于以前合并A0
和A
更改。在新的父B
级中,基于此合并的更改日志条目现在已被重新划分为 2 个单独的更改日志条目,显然这不是 Git 可以自动解决的问题。
我很好。解决我自己应该不是特别难,所以我启动了我的图形合并工具。但是,虽然合并工具允许我在一侧的旧组合更改日志条目和另一侧的新单独更改日志条目之间进行选择,但我注意到它B
自己提供的新更改日志条目完全丢失(无论哪种选择我做)!!我不明白为什么 Git 会忘记这部分。我究竟做错了什么?
解决方案
问题是 B 站在原来的 A 之上……你可以这样做:
git rebase --onto origin/master B~1 B
这样,您只移动与 B 相关的唯一修订,而不是来自 A 的任何修订。如果与 B 相关的修订不止一个,只需调整倒数第二个参数的修订数(3 个修订? B~3)。
推荐阅读
- postgresql - liquibase 返回 DiffChangeLog 的误报结果
- azure - 使用 Azure Grid Events 触发 ADF Pipe 将本地 CSV 文件移动到 Azure 数据库
- vue.js - 支持 vuejs 中的可选链接
- html - 如何使用适合图像内部的 div 调整图像角度
- sql - 为什么在表权限列表中看不到我的表权限?
- python - int 太大,无法在 python 中转换
- python - Python列表理解缺少信息
- html - 单击按钮后 5 秒显示 div
- flutter - 有没有办法为多个小部件共享相同的数据?
- ios - 删除 UIWebView 后,来自 App Store 的相同错误