我有一个具有 root R
的现有存储库,然后是几十次提交,包括多次 merge ,最多 X
,然后线性历史直到 Y
。我想粉碎 R
中的所有内容至X
进入单个提交并强制推送它。我怎样才能做到这一点而不需要花费大量精力重新解决 merge ?
或者,这个问题可以表述为从 R
更改根提交。至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
使用常规 rebase 来压缩所有内容将需要重新解析多个 merge 提交。我知道 git rerere,但我不知道如何在这种情况下使用它。提交所有这些时,它并未启用。
最佳答案
这可以通过 rebase 来完成,但手动完成要容易得多
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 之后的历史很复杂,最好为最后一步运行 rebase :
git rebase --rebase-merges X Y --onto temp
如果该历史记录很复杂并且包含有冲突的 merge ,我可以提供此脚本来处理最后一步,以避免必须重做有冲突的 merge :
关于git - 压缩包含 merge 提交的前几十个 git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75457384/