删除git merge commit没有冲突

jogvjijk  于 9个月前  发布在  Git
关注(0)|答案(2)|浏览(147)

下面是我的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
...

vuv7lop3

vuv7lop31#

下面是一种将分支B的历史压缩在一起的方法:
1.使用git replace创建一个提交,具有相同的结束内容,但只有一个父提交,* 和 * 一个替换规则

git replace --graft [target commit] [the parent you want]
# with the hashes you provided:
git replace --graft 3e5282cb 2740d295

字符串
在您的计算机上,git log --oneline --graph应该已经显示了简化的历史记录
1.要使此替换规则永久化并实际重写历史记录,请使用git filter-repogit filter-branch

git filter-repo --replace-refs delete-no-add

# or
git filter-branch --env-filter true


关于git filter-branch:使替换永久化实际上是git filter-branch [any command]的副作用,您可以使用任何子命令(--index-filter--env-filter--tree-filter ...)和任何脚本操作,只要它使git filter-branch通过。--env-filter true恰好是方便的,因为git不会读取或写入磁盘上的任何文件,true没有副作用。

yyhrrdl8

yyhrrdl82#

如果你使用rebase interactive,听起来会很痛苦.

git rebase --rebase-merges --onto 2740d295 3e5282cb HEAD

字符串
这应该会删除来自B的提交 * 和 * 2个合并提交。这并不是说你不会得到冲突.你仍然会得到冲突,但是考虑到你使用的是--rebase-merges,它 * 将 * 包括合并(尽管你可能仍然需要解决合并中的冲突),其他冲突可能与你 * 不 * 包括来自B的更改有关。

相关问题