git - git rebase 一个浮动分支
问题描述
我在这里基于解决方案导入了另一个 repo 作为分支。
现在,新导入的分支是浮动的,它应该按照图像中指定的方式连接。
我应该如何做rebase?
git checkout imported-branch
git rebase ????? --onto ????
解决方案
你不能得到你画的东西,因为你画了提交哈希 ID:f8114a
例如。鉴于它f8114a
被绘制为根提交,这意味着它f8114a
始终是根提交,在过去、现在和将来也是如此。但在绘图的右侧,f8114a
不是根提交:它有一个parentd0ece
。因此,您声称这f8114a
既是根提交(没有父级)又是常规的日常提交(一个父级,d0ece
),这根本不可能。
你也许能得到你想要的。这完全取决于您想要什么。但是,尝试这样做通常是一个坏主意:如果您git rebase
尝试移植到其中一个分支的提交集中有任何分支和合并操作,那么rebase 本身将不得不重新执行任何一个所涉及的合并,这是破坏东西的秘诀。
现在,请记住,任何提交,无论其哈希 ID 可能是什么,以及它可能具有的父哈希 ID,都代表了该提交中包含的文件的完整且完整的快照。所以提交f8114a
是一个快照。由于它没有父级(在左侧),Git 会将其显示为与没有文件的伪提交的比较。1 因此,当被视为一组更改时,f8114a
包括添加其所有文件。
如果你把f8114a
它复制到一个新的和改进的?commit——我们称它为f9114a
,虽然实际的哈希 ID 可能会有所不同,但我们需要有一些东西来称呼它2——它确实有一个父提交,但是,现在git show
和其他将副本与其父进行比较的 Git 操作将有要比较的快照。所以现在,不是添加所有这些文件,差异可能会说删除大部分文件,并创建这些大多是新的文件,然后更改大量剩余的文件。
如果这对您来说没问题,那么很容易在您自己的存储库中发生这种情况,而不会发生在任何人对您的存储库进行的任何克隆中。只需git replace
与--graft
选项一起使用。有关详细信息,git replace
请参阅文档。
一旦您对某些替代品感到满意,您就可以使用无操作git filter-repo
(或旧但仍受支持,并包含在 Git 发行版中git filter-branch
)来重写从imported-branch
. 这将“将替换物固定到位”并允许您丢弃移植物;克隆此过滤存储库将生成过滤存储库的副本,该副本不再使用替换技巧。
1从技术上讲,Git 使用空树来伪造这个伪提交。它将您的提交树与空树进行比较,以生成所有“添加整个文件”差异块。
2如果你愿意,可以称它为 Fred、Barney 或 Wilma;只是不要晚饭。
推荐阅读
- .htaccess - htaccess 重定向 GET 请求
- r - 按不同变量填充和分组条形图
- mysql - 从 MySQL 的列中查找数组中的元素
- highcharts - Highcharts堆积列如何在每个类别上使用不同的标签
- assembly - monitor/mwait 指令的使用
- jenkins - 使用 Maven 创建本地远程存储库
- java - 如何将此代码转换为准备好的语句或 jdbc 中的语句?
- java - JavaFX:StackPane 顺序转换
- java - Java:获取主应用程序的资源路径而不是 jar 的
- javascript - React Native 的 RTL 幻灯片