我有一个具有 root 权限的现有存储库R
,然后是几十次提交,包括多次合并,最多X
,然后线性历史直至Y
。我想压碎一切R
to X
进入单个提交并强制推送它。我怎样才能做到这一点而不需要花费大量精力重新解决合并问题?
或者,这个问题可以表述为更改根提交R
to X
并剪掉之前的图表X
.
这是简化提交图的图示:
R ---- I want to squash from here...
|
A
|\
B C
| |
D E
| |\
F G H
| |/
I J
|\ \
K L M
|/ |
N /
|/
O
|
X ---- to here.
|
P
|
Q
|
Y
使用常规变基压缩所有内容将需要重新解决多个合并提交。我知道 git rerere,但我不知道如何在这种情况下使用它。提交所有这些时它没有启用。
这可以通过变基来完成,但手动完成要容易得多
git checkout --orphan temp X
# now you are on a brand new branch with no history, and your working tree is just like X
git commit -m "Single shot"
# now let's carry over X up to Y
git cherry-pick X..Y
如果你喜欢这个结果,就把你的树枝放在这里,从此过上幸福的生活。
更新:
如果 D 之后的历史很复杂,最好为最后一步运行变基:
git rebase --rebase-merges X Y --onto temp
如果该历史记录很复杂并且包含有冲突的合并,我可以提供此脚本来处理最后一步,以避免必须重做有冲突的合并:
https://github.com/eantoranz/git-replay
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)