下面是我的git提交历史:
HEAD
... +500 commits
A 4140759b
A c5cf69a2
A 3e5282cb ⎯┐ << Merge branch B
| 94936548 B
| 02a550ce B
A 5d09daa9 ⎯┤ << Pull request
| afbe397b B << Merge branch A into B
| 74fe4f3c B
| 86cdc993 B
| 223e1740 B
| a7ea596a B
| 0d4c36cf B
A 2740d295 |
A 24437962 |
A 73725f04 |
A 90be4300 |
A 6b1720d6 ⎯┘
A d65bf4bd
...
字符串
我想删除B分支历史并合并提交,只保留A分支历史。
但是,它们是非常古老的提交,在最近的提交之间有数百次提交,
所以git rebase -i
命令产生了很多我无法解决的冲突。
如果d65bf4bd和c5cf69a2之间的一些提交被丢弃了,这并不重要。
但是,在c5cf69a2之后的最近提交不应该受到影响。
我如何才能完全删除B分支历史,从历史?
我的预期结果看起来像这样:
HEAD
... +500 commits
pick A 4140759b
pick A c5cf69a2
[drop] A 3e5282cb ⎯┐ << Merge branch B
[drop] | 94936548 B
[drop] | 02a550ce B
[drop] A 5d09daa9 ⎯┤ << Pull request
[drop] | afbe397b B << Merge branch A into B
[drop] | 74fe4f3c B
[drop] | 86cdc993 B
[drop] | 223e1740 B
[drop] | a7ea596a B
[drop] | 0d4c36cf B
pick A 2740d295 |
pick A 24437962 |
pick A 73725f04 |
pick A 90be4300 |
pick A 6b1720d6 ⎯┘
pick A d65bf4bd
...
型
2条答案
按热度按时间vuv7lop31#
下面是一种将分支B的历史压缩在一起的方法:
1.使用
git replace
创建一个提交,具有相同的结束内容,但只有一个父提交,* 和 * 一个替换规则字符串
在您的计算机上,
git log --oneline --graph
应该已经显示了简化的历史记录1.要使此替换规则永久化并实际重写历史记录,请使用
git filter-repo
或git filter-branch
型
关于
git filter-branch
:使替换永久化实际上是git filter-branch [any command]
的副作用,您可以使用任何子命令(--index-filter
,--env-filter
,--tree-filter
...)和任何脚本操作,只要它使git filter-branch
通过。--env-filter true
恰好是方便的,因为git
不会读取或写入磁盘上的任何文件,true
没有副作用。yyhrrdl82#
如果你使用rebase interactive,听起来会很痛苦.
字符串
这应该会删除来自B的提交 * 和 * 2个合并提交。这并不是说你不会得到冲突.你仍然会得到冲突,但是考虑到你使用的是
--rebase-merges
,它 * 将 * 包括合并(尽管你可能仍然需要解决合并中的冲突),其他冲突可能与你 * 不 * 包括来自B
的更改有关。