git 如何非交互地压缩从根提交到过去某个提交的提交范围?[重复]

gkl3eglg  于 2023-03-21  发布在  Git
关注(0)|答案(2)|浏览(99)

此问题在此处已有答案

Squashing first few dozens of git commits that contain merge commits(2个答案)
3天前关闭。
如果我有以下病史

A-B-C-D-E-F-G

A是根提交,我想压缩A-D,但保持E不变,我发现了一种方法,只需两步即可完成

git rebase --onto A C

那么它就变成了

A-D'-E-F-G

然后我做一个

git rebase -i --root

在vim中我交互地设置D'为s,然后我就可以得到我想要的

A'-E-F-G

其中A'具有从A-B-C-D的所有变化,而E仍然是原始的E(其差异没有改变)
我可以用更简单的方法来做上面的事情吗?可以在一个git命令中使用一些神奇的--onto命令吗?(非交互式)因为在真实的的例子中,我有几百个提交,而不仅仅是A-B-C-D。

3yhwsihp

3yhwsihp1#

我不久前得到了这个答案(比如几周前?)。可以这样做:

git checkout --orphan a-new-branch D
git commit -m "Single commit for A..D"
git cherry-pick D..G

这里就是了,还有其他的重置方法,但我认为这已经足够简单了。
更新:如果D后面的历史很复杂,最好在最后一步运行一个rebase:

git rebase --rebase-merges D G --onto a-new-branch

*如果历史很复杂并且 * 它包括有冲突的合并,我可以提供 this 脚本来处理最后一步,以避免必须重做有冲突的合并:

https://github.com/eantoranz/git-replay

oxcyiej7

oxcyiej72#

假设你写的所有东西都能按原样工作,你能在命令A之前使用commit吗?
X-A-B-C-D-E-F-G
根据你的说法
git rebase --onto X C
应该给予你
X-D'-E-F-G

相关问题